为什么在对象的实例化之后定义的属性不是自己的属性

时间:2016-03-17 15:29:04

标签: javascript class oop hasownproperty

这里我创建了一个父类的实例,并在对象本身上定义了一个名为smile的属性。我知道构造函数原型上定义的属性不是对象自己的属性。但是,“smile”属性怎么没有在for循环中传递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"
   }
}

2 个答案:

答案 0 :(得分:4)

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

hasOwnPropertyObject.prototype上定义,这意味着大多数对象(除了您手动将原型设置为null的对象)将继承该方法,因此它可以被调用他们。 p就是这样一个对象。它的原型链没有什么不寻常之处,所以根据上面的描述改变它应该有效。

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

答案 1 :(得分:3)

if (Object.hasOwnProperty(prop)) {

检查Object是否为给定名称的自有属性。 Object.name函数中存在Object,这就是它返回true的原因。

想要的p.hasOwnProperty(prop),以便您检查实例本身是否具有属性而不是继承原型。但是,如果实例具有名为hasOwnProperty的自己的属性,则以这种方式调用该函数将导致问题,因此通常会看到扩展形式:

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