
对象的原型只是一个对象。原型属性在从该对象继承的所有对象之间共享。如果您创建“类”的新实例(JS中始终不存在类),即从原型继承的对象,则不会复制属性。
它仅对如何使用这些继承的属性有所不同:
function Foo() {}Foo.prototype = { array: [], func: function() {}}a = new Foo();b = new Foo();a.array.push('bar');console.log(b.array); // prints ["bar"]b.func.bar = 'baz';console.log(a.func.bar); // prints baz在所有这些情况下,您始终使用相同的对象。
但是,如果您为对象的属性分配值,则该属性将在对象本身而非其原型上设置/创建,因此不会共享:
console.log(a.hasOwnProperty('array')); // prints falseconsole.log(a.array); // prints ["bar"]a.array = ['foo'];console.log(a.hasOwnProperty('array')); // prints trueconsole.log(a.array); // prints ["foo"]console.log(b.array); // prints ["bar"]如果要为每个实例创建自己的数组,则必须在构造函数中对其进行定义:
function Foo() { this.array = [];}因为这里
this是指
new调用时生成的对象
new Foo()。
经验法则是:应将 实例* 特定的数据分配给 构造函数内部的实例,将 共享数据(如方法)分配给 原型 。 __ *
__
您可能需要阅读对象模型的详细信息其中描述了基于类的语言与基于原型的语言之间的差异以及对象的实际工作方式。
更新:
您可以通过访问一个对象的原型
Object.getPrototypeOf(obj)(可能无法正常工作在很老的浏览器),并
Object.getPrototypeOf(a)=== Object.getPrototypeOf(b)给你
true。它是同一对象,也称为
Foo.prototype。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)