0

「Javascript The Definitive Guide」の継承について読む

[オブジェクト] がプロパティ x を以前に継承した場合、その継承されたプロパティは、新しく作成された同じ名前の独自のプロパティによって隠されます。

よりよく理解するために例を作成しました

var o = {x:1};
var p = Object.create(o);
p.x = 5;
console.log(p.x); //5
console.log(p); //Object {x: 5, x: 1} 

この場合、なんらかの理由xで値を持つプロパティにアクセスすることは可能1ですか?

4

1 に答える 1

1

できるよ:

delete p.x;

次のこともできる場合があります。

p.constructor.prototype.x;

ただし、コンストラクター プロパティは書き込み可能であり、オブジェクトが Object.create を使用して構築されている場合、そのコンストラクターは Object 関数であり、そのプロトタイプは のプロトタイプではないため、これは特に堅牢ではありませんp。オブジェクトを参照している場合でも、そのプロトタイプ プロパティが目的のオブジェクトではない場合があります。

次のこともできます。

p.__proto__.x;

しかし、これは非標準であり、すべてのブラウザーでサポートされているわけではなく、の将来は__proto__不確実です。

したがって、おそらく次のようなことをするのが最善です:

if (p.hasOwnProperty('x')) {
  var x = p.x;
  delete p.x;
  var x2 = p.x;
  p.x = x;
}

ただし、これが重要な場合、 for..in ループからプロパティが返される順序に影響を与える可能性があることに注意してください (順序は保証されておらず、ブラウザー間で一貫性がないため、そうすべきではありませんが、これにより可能性が高くなります)異なるように)。ピクセル

于 2013-03-06T23:49:23.563 に答える