基本的に、JavaScript でメンバ列挙について書いている人は皆hasOwnProperty
、プロトタイプ チェーンを上がらないようにメソッドを使用することを強く推奨しています。
これは、たとえばObject.prototype
. しかし、他の継承されたメンバーはどうですか? たとえば、プロトタイプ チェーンで非常に近いメンバー...実際に列挙したいメンバーです。
私が次のものを持っているとしましょう:
var beget = function (o) { // http://javascript.crockford.com/prototypal.html
function F() {};
F.prototype = o;
return new F();
};
var john = { name: 'john', surname: 'grech' },
mary = beget(john),
p;
mary.age = 42; //augmenting 'mary'
// 'surname' in mary => true
// mary.hasOwnProperty('surname') => false
for (p in mary) {
//skipping over non-direct members, meaning that we also skip members
//inherited from 'john'
if (!mary.hasOwnProperty(p)) {
continue;
}
console.log(p);
}
上記のサンプルでは、 のみage
が表示されます。これは、 が...他の 2 つのメンバーage
の唯一の直接メンバーであり、 と がプロトタイプ チェーンの上にあるためです。mary
name
surname
しかし、明らかに、3 つのメンバーすべてを構成内で反復処理する必要がありfor..in
ます。ただし、を削除すると、誰かが関数を追加した場合hasOwnProperty
にメンバーを取得できます。Object.Prototype
これが私のジレンマです。
プロトタイプの継承をメソッドと組み合わせて使用しますが、hasOwnProperty
列挙中にチェーンの上位にあるメンバーを取得するリスクがありますか?
それとも、プロトタイプではなくオブジェクトにメンバーを直接追加する他の形式の継承を使用しますか?