对象的原型只是一个对象。原型属性在所有对象之间共享inherit来自那个物体。如果您创建“类”的新实例(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
在所有这些情况下,您始终使用同一个对象。
但如果你assign对象属性的值,该属性将在对象本身而不是其原型上设置/创建,因此不会共享:
console.log(a.hasOwnProperty('array')); // prints false
console.log(a.array); // prints ["bar"]
a.array = ['foo'];
console.log(a.hasOwnProperty('array')); // prints true
console.log(a.array); // prints ["foo"]
console.log(b.array); // prints ["bar"]
如果要为每个实例创建自己的数组,则必须在构造函数中定义它:
function Foo() {
this.array = [];
}
因为在这里,this
指的是new
调用时生成的对象new Foo()
.
经验法则是:Instance-具体数据应分配给instance在 - 的里面构造函数, shared数据(如方法)应分配给原型.
您可能想阅读对象模型的详细信息 https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model它描述了基于类的语言与基于原型的语言之间的差异以及对象的实际工作方式。
Update:
您可以通过以下方式访问对象的原型Object.getPrototypeOf(obj)
(可能无法在非常旧的浏览器中工作),并且Object.getPrototypeOf(a) === Object.getPrototypeOf(b)
给你true
。它是同一个对象,也称为Foo.prototype
.