我总是假设函数的原型在所有对象之间共享,在某种意义上通过引用.因此,如果更改原型属性的值,则共享该原型的所有对象的值也会更改.因此,例如下面似乎不是在所有对象之间共享属性栏,而是复制它.这是正确的吗?构造函数原型的属性是在创建时简单地复制到所有类对象,还是由链接共享?
function foo() { this.bar = 1; } function derived() { } derived.prototype = new foo() object1 = new derived() object2 = new derived() object1.bar = 2; //but notice if I had said here derived.prototype.bar = 3,object1.bar would still equal 2 but object2.bar would equal 3 alert(object2.bar) // this prints 1;
解决方法
当您指定object1.bar = 2时,您正在object1上创建一个自己的属性,此属性仅存在于该对象实例中,并且与其原型无关.
object1上的此属性将遮蔽derived.prototype上存在的值,这意味着当您查找object1.bar时,它将找到直接存在于该对象上的值.
另一方面,如果你查找object2.bar,这个对象没有自己的bar属性,所以属性查找将搜索这个继承自(derived.prototype)的对象,它将找到值1.
您的对象结构如下所示:
object1 -------- | bar: 2 | ----------------- -------- | derived.prototype | ---------- |------> | bar: 1 | -- foo.prototype object2 (no own properties)| ---------- | ------------------ -------- | -> | constructor: foo | | | ----------------- ------------------ -------- | v ------------------ | Object.prototype | ------------------ | v null
哪里—> lines表示表示继承的内部[[Prototype]]链接.