2012-04-12 64 views
0

下面的代码是从http://bonsaiden.github.com/JavaScript-Garden/的Javascript原型的传承

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; 

现在值不是test1的对象的一部分的行为,但它是其原型的属性,它是一个Foo对象,并且由于原型是Foo对象,Bar的所有实例都将共享值属性,我期望上面的代码所做的是将该值属性设置为24,但相反,它会为test1创建一个名为'value'的新属性对象并将其赋值24,将原型中的value属性保留为其初始值42.这听起来不像共享。 test2.value仍然有一个值42.当我看着萤火虫控制台中的原型链时,它显示test1具有值为24的属性,并且其原型具有值为42的属性。

这很混乱至。有没有人找出它为什么这样表现?

回答

2

阅读性质且仅当在对象本身是没有找到该属性的原型链只使用 - 当属性值,不作为。

只要你属性为对象(test1.value = 24)在原型具有相同名称的任何现有的“共享”的属性是隐藏的,以及所有后续读取将访问值现在的对象本身存储。

1

我想你想.hasOwnProperty()

如果这是你在找什么,别人已经雄辩地把它概括这里 hasOwnProperty in javascript

编辑

看了其他回答,然后正确地阅读这次的问题...我想撤回这一点;-)

...

或者它可能是你正在寻找的东西,你想在做别的事情之前检查该属性是否已经设置在'哈希'上。

我读过这太多次和困惑我想,我会闭嘴现在

1

只需追加下列在最后,检查发生了什么事情。

var test1 = new Bar(); 
test1.value = 30; 

console.log(test1.hasOwnProperty("value")); 
console.log(test1.value); 

delete test1.value; 

console.log(test1.hasOwnProperty("value")); 
console.log(test1.value); 

输出:

true 
30 
false 
42 

条款:

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

Explanantion 如果我们分配一个值,那么它会创建它自己的本地属性和覆盖原型属性。因而,作为地方性质比原型性能更高的优先级,它们首先被读取。