以下代码取自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;
我多次遇到过这种解释“当访问对象的属性时,首先它检查对象自身是否具有该属性,如果没有,则转到该对象的原型以查找该属性等等。”
但是由于以下代码的行为,我很难理解这实际上是有效的
var test1 = new Bar();
var test2 = new Bar();
test1.value = 24;
现在 value 不是 test1 对象的一部分,但它是它的原型的属性,它是一个 Foo 对象,并且由于原型是一个 Foo 对象,所有 Bar 实例都将共享 value 属性,我希望上面的代码做的是将该 value 属性设置为 24,而是为 test1 对象创建一个名为“value”的新属性,并将其分配为 24,将原型中的 value 属性保留为其初始值 42。这听起来不像是共享。test2.value 的值仍然为 42。当我在 firebug 控制台中查看原型链时,它显示 test1 的 value 属性为 24,其原型的 value 属性为 42。
这是非常令人困惑的。有没有人知道它为什么会这样?