Javascript原型继承

时间:2012-04-12 12:43:48

标签: javascript

以下代码取自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。

这非常令人困惑。有没有人你弄清楚它为什么会这样?

3 个答案:

答案 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"}'.

<强>条款:

  • hasOwnProperty 只返回true,key是对象的本地属性。
  • delete 用于删除不接触继承属性的本地属性。

<强> Explanantion 如果我们分配一个值,那么它会创建它自己的本地属性并覆盖原型属性。因此,由于本地属性具有比原型属性更高的优先级,因此首先阅读它们。