【发布时间】:2012-04-12 12:43:48
【问题描述】:
以下代码取自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。
这很令人困惑。有没有人知道它为什么会这样?
【问题讨论】:
标签: javascript