0

ここでは、親クラスのインスタンスを作成し、オブジェクト自体に 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"
   }
}
4

2 に答える 2

3
if (Object.hasOwnProperty(prop)) {

Object指定された名前の独自のプロパティであるかどうかを確認します。が関数にObject.name存在するため、 が返されます。Objecttrue

必要なのは、プロトタイプから継承するのではなく、インスタンス自体にプロパティがあるかどうかを確認することですp.hasOwnProperty(prop)ただし、この方法で関数を呼び出すと、インスタンスに という名前の独自のプロパティがある場合に問題が発生するhasOwnPropertyため、次の展開された形式がよく見られます。

Object.prototype.hasOwnProperty.call(p, prop)
于 2016-03-17T15:36:54.850 に答える