以下代码取自http://bonsaiden.github.com/JavaScript-Garden/
function Foo() {
this.value = 42;
}
Foo.prototype = {
method: function() {}
};
function Bar() {}
// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';
// Make sure to list Bar as the actual constructor
Bar.prototype.constructor = Bar;
我多次遇到过这个解释 “当访问一个对象的属性时,它首先检查该对象自身是否具有该属性,如果没有,则转到该对象的原型(prototype)来查找该属性,依此类推。”
但是由于以下代码的行为,我很难理解这实际上是如何工作的
var test1 = new Bar();
var test2 = new Bar();
test1.value = 24;
现在 value 不是 test1 对象的一部分,但它是其原型(prototype)(即 Foo 对象)的属性,并且由于原型(prototype)是 Foo 对象,所以 Bar 的所有实例都将共享 value 属性,我期望上面的代码要做的是将 value 属性设置为 24,但它会为 test1 对象创建一个名为“value”的新属性,并将其分配为 24,将原型(prototype)中的 value 属性保留为其初始值 42。这听起来不像是共享。 test2.value 的值仍然是 42。当我在 firebug 控制台中查看原型(prototype)链时,它显示 test1 的 value 属性为 24,其原型(prototype)的 value 属性为 42。
这非常令人困惑。有谁知道它为什么会这样吗?
最佳答案
原型(prototype)链仅在读取属性时使用,并且仅当在对象本身中未找到该属性时使用 - 在写入属性值时不使用原型(prototype)链。
一旦您将属性写入对象 (test1.value = 24
),原型(prototype)中任何现有的同名“共享”属性都会被隐藏,并且所有后续读取都将访问现在存储在对象本身中的值。
关于Javascript原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10123832/