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

AL-*_*ami 1 javascript oop class hasownproperty

这里我创建了一个父类的实例,并在对象本身上定义了一个名为 smile 的属性。我知道构造函数原型上定义的属性不是对象自己的属性。但是为什么“smile”属性没有通过 for in 循环内的 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"
   }
}
Run Code Online (Sandbox Code Playgroud)

rhi*_*ino 5

你用错了Object.prototype.hasOwnProperty()。上述函数将以被测试对象作为上下文来调用,这意味着您应该这样做p.hasOwnProperty(prop)而不是Object.hasOwnProperty(prop). 然后你就会得到你期望的结果。

hasOwnProperty 是在 上定义的Object.prototype,这意味着大多数对象(除了您手动将原型设置为 的对象之外null)将继承该方法,以便可以在它们上调用该方法。p就是这样一个物体。它的原型链没有什么异常,所以根据上面的描述进行更改后应该可以工作。

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