在JavaScript中使用’prototype’与’this’?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在JavaScript中使用’prototype’与’this’?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3046字,纯文字阅读大概需要5分钟。
内容图文
![在JavaScript中使用’prototype’与’this’?](/upload/InfoBanner/zyjiaocheng/717/a702fae964ca4e859d830751f21b7c5d.jpg)
有什么区别
var A = function () {
this.x = function () {
//do something
};
};
和
var A = function () { };
A.prototype.x = function () {
//do something
};
解决方法:
这些例子的结果截然不同.
在查看差异之前,应注意以下事项:
>构造函数的原型提供了一种通过实例的private [[Prototype]]属性在实例之间共享方法和值的方法.
>函数的设置取决于函数的调用方式或使用bind(此处未讨论).在对象上调用函数(例如myObj.method())的情况下,该方法中的函数引用该对象.如果未通过调用或使用bind设置,则默认为全局对象(浏览器中的窗口)或严格模式,仍未定义.
> JavaScript是一种面向对象的语言,即大多数值都是对象,包括函数. (字符串,数字和布尔值不是对象.)
所以这里是有问题的片段:
var A = function () {
this.x = function () {
//do something
};
};
在这种情况下,为变量A分配一个值,该值是对函数的引用.当使用A()调用该函数时,该函数不会被调用设置,因此它默认为全局对象,而表达式this.x是有效的window.x.结果是对右侧的函数表达式的引用被赋予window.x.
如果是:
var A = function () { };
A.prototype.x = function () {
//do something
};
发生了一些非常不同在第一行中,变量A被赋予对函数的引用.在JavaScript中,默认情况下所有函数对象都具有prototype属性,因此没有单独的代码来创建A.prototype对象.
在第二行中,为A.prototype.x分配了对函数的引用.如果它不存在,这将创建一个x属性,如果不存在则创建一个新值.所以与第一个示例的区别在于对象的x属性涉及表达式.
另一个例子如下.它与第一个类似(也许你想问的是):
var A = new function () {
this.x = function () {
//do something
};
};
在此示例中,在函数表达式之前添加了new运算符,以便将该函数作为构造函数调用.当使用new调用时,函数将设置为引用一个新的Object,其private [[Prototype]]属性设置为引用构造函数的公共原型.因此在赋值语句中,将在此新对象上创建x属性.当作为构造函数调用时,函数默认返回其对象,因此不需要单独返回此对象;声明.
要检查A是否具有x属性:
console.log(A.x) // function () {
// //do something
// };
这是一个不常见的新用法,因为引用构造函数的唯一方法是通过A.constructor.这样做会更常见:
var A = function () {
this.x = function () {
//do something
};
};
var a = new A();
实现类似结果的另一种方法是使用立即调用的函数表达式:
var A = (function () {
this.x = function () {
//do something
};
}());
在这种情况下,A分配了在右侧调用函数的返回值.在这里,由于未在调用中设置,因此它将引用全局对象,this.x是有效的window.x.由于函数不返回任何内容,因此A的值将为undefined.
如果您将Javascript对象序列化和反序列化为JSON,则这两种方法之间的差异也会显现出来.在序列化对象时,对象原型上定义的方法不是序列化的,例如,当您想要仅序列化对象的数据部分时,这可能很方便,但不是它的方法:
var A = function () {
this.objectsOwnProperties = "are serialized";
};
A.prototype.prototypeProperties = "are NOT serialized";
var instance = new A();
console.log(instance.prototypeProperties); // "are NOT serialized"
console.log(JSON.stringify(instance));
// {"objectsOwnProperties":"are serialized"}
相关问题:
> What does it mean that JavaScript is a prototypal language?
> What is the scope of a function in JavaScript?
> How does the “this” keyword work?
旁注:两种方法之间可能没有任何显着的内存节省,但是使用原型共享方法和属性可能比使用自己的副本的每个实例使用更少的内存.
JavaScript不是一种低级语言.将原型设计或其他继承模式视为明确更改内存分配方式的方法可能不是很有价值.
内容总结
以上是互联网集市为您收集整理的在JavaScript中使用’prototype’与’this’?全部内容,希望文章能够帮你解决在JavaScript中使用’prototype’与’this’?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。