2016-03-17 34 views
0

这里我创建了一个父类的实例,并在对象本身上定义了一个名为smile的属性。我知道在构造函数原型上定义的属性不是对象自己的属性。但是如何让“smile”属性在循环中没有通过hasOwnProperty测试?为什么在对象实例化后定义的属性不是自己的属性

function Parent(){ 
    this.name='parent'; 
} 
Parent.prototype.age='34'; 

var p=new Parent(); 
p.smile='nice'; // not an own property ? 
console.log(p); 
for(var prop in p){ 
    if(Object.hasOwnProperty(prop)){ 
     console.log(prop); // prints only "name" 
    } 
} 

回答

3
if (Object.hasOwnProperty(prop)) { 

检查是否Object作为给定名称的属性。在Object函数上存在Object.name,这就是为什么它返回true

什么是p.hasOwnProperty(prop)让你检查,如果该实例本身所具有的属性,而不是从原型继承。然而,调用函数以这种方式会导致一些问题,如果该实例有一个名为hasOwnProperty一个自己的财产,所以它经常可以看到的扩展形式:

Object.prototype.hasOwnProperty.call(p, prop) 
4

你滥用Object.prototype.hasOwnProperty()。所述函数将以测试对象作为上下文来调用,这意味着您应该执行p.hasOwnProperty(prop)而不是Object.hasOwnProperty(prop)。然后你会得到你期待的结果。

hasOwnProperty被限定在Object.prototype,这意味着大多数对象(与那些已为其手动设置原型null除外)将继承方法,这样就可以对其进行调用。 p就是这样一个对象。它的原型链没有什么特别之处,所以根据上面的描述改变它应该可以工作。

现在您可能会问,为什么您的代码不会在if语句行上抛出错误。这是因为Object是一个功能,因此最终从Object.prototype继承。

相关问题