以下代码取自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。
这非常令人困惑。有没有人你弄清楚它为什么会这样?
答案 0 :(得分:2)
原型链仅在读取属性时使用,并且仅在对象本身中未找到属性时使用 - 在写入属性值时不使用它。
只要您将属性写入对象(test1.value = 24
),就会隐藏原型中具有相同名称的任何现有“共享”属性,并且所有后续读取都将访问value现在存储在对象本身中。
答案 1 :(得分:1)
我想你想要.hasOwnProperty()
如果这就是你要找的东西,别人就在这里雄辩地总结了一下 hasOwnProperty in javascript
修改强>
读完了另一个答案,然后这次正确阅读了这些问题......我想撤回这个问题; - )
...
或者也许这就是你要找的东西,你想要在做其他事情之前检查是否已经在'hash'上设置了属性。
我已经阅读过这么多次并且混淆了我想,我现在会闭嘴
答案 2 :(得分:1)
只需在末尾添加以下行,即可查看正在进行的操作。
true
30
false
42
<强>输出:强>
Expected '4' to equal 'ManagedPromise::1428 {[[PromiseStatus]]: "pending"}'.
<强>条款:强>
<强> Explanantion 强> 如果我们分配一个值,那么它会创建它自己的本地属性并覆盖原型属性。因此,由于本地属性具有比原型属性更高的优先级,因此首先阅读它们。