注:の値を変更することは悪い習慣と考えられています__proto__
。そうすることは、特に JavaScript の作成者である Brendan Eich によって強く推奨されていません。実際、この__proto__
プロパティは、Rhino などのいくつかの JavaScript エンジンから完全に削除されています。その理由を知りたい場合は、Brendan Eich による次のコメントをお読みください。
更新:__proto__
ブラウザーはプロパティを削除しません。実際、ECMAScript Harmony__proto__
はプロパティとsetPrototypeOf
関数の両方を標準化しています。プロパティは、__proto__
従来の理由でのみサポートされています。の代わりにsetPrototypeOf
andを使用することを強くお勧めします。getPrototypeOf
__proto__
警告:は標準になっていsetPrototypeOf
ますが、オブジェクトのプロトタイプを変更すると常に最適化が無効になり、コードが遅くなるため、使用しないことをお勧めします。さらに、 の使用setPrototypeOf
は通常、コードの品質が低いことを示しています。
既存のコードがいつか機能しなくなることを心配する必要はありません。__proto__
プロパティはここにあります。
さて、当面の質問です。標準に準拠した方法で、これと同様のことを行いたいと考えています。
var a = {
b: "ok"
};
a.__proto__ = {
a: "test"
};
alert(a.a); // alerts test
alert(a.b); // alerts ok
Object.create
新しいオブジェクトを作成していないため、明らかにこの目的を達成するために を使用することはできません。[[proto]]
特定のオブジェクトの内部プロパティを変更しようとしているだけです。[[proto]]
問題は、オブジェクトが作成されると、オブジェクトの内部プロパティを変更できないことです (__proto__
回避しようとしている using による場合を除きます)。
この問題を解決するために、単純な関数を作成しました (関数を除くすべてのオブジェクトで機能することに注意してください)。
function setPrototypeOf(obj, proto) {
var result = Object.create(proto);
var names = Object.getOwnPropertyNames(obj);
var getProp = Object.getOwnPropertyDescriptor;
var setProp = Object.defineProperty;
var length = names.length;
var index = 0;
while (index < length) {
var name = names[index++];
setProp(result, name, getProp(obj, name));
}
return result;
}
したがって、次のように、オブジェクトの作成後にそのプロトタイプを変更できるようになりました ([[proto]]
オブジェクトの内部プロパティを実際に変更するのではなく、指定されたオブジェクトと同じプロパティを持ち、指定されたプロトタイプから継承する新しいオブジェクトを作成することに注意してください)。 ):
var a = {
b: "ok"
};
a = setPrototypeOf(a, {
a: "test"
});
alert(a.a); // alerts test
alert(a.b); // alerts ok
<script>
function setPrototypeOf(obj, proto) {
var result = Object.create(proto);
var names = Object.getOwnPropertyNames(obj);
var getProp = Object.getOwnPropertyDescriptor;
var setProp = Object.defineProperty;
var length = names.length;
var index = 0;
while (index < length) {
var name = names[index++];
setProp(result, name, getProp(obj, name));
}
return result;
}
</script>
__proto__
シンプルで効率的です (このプロパティは使用しませんでした)。