__proto__は、[[prototype]]にアクセスするための特殊なプロパティーである。色々なブラウザに実装され、デファクト・スタンダードとなった。現在では非推奨である。
代わりに
Object.create(proto, [descriptors])
Object.getPrototypeOf(obj)
Object.setPrototypeOf(obj, proto)
を使う。
__proto__ の例
let obj1 = {
prop1 : "ABC"
}
let obj2 = {
__proto__ : obj1
}
alert(obj2.prop1); // ABCが表示される。obj2.__proto__.prop1 (obj1.prop1)が参照される。
obj2.__proto__ = "TEST"; // プリミティブは代入できない。
alert(obj2.__proto__); // [object Object]が表示される。
obj2.__proto__ = {
prop1 : "XXX"
}; // オブジェクトは代入できる。
alert(obj2.prop1); // XXXが表示される。
objectをmapとして使用した場合、画面入力からキーとバリューを作成した場合、キーに"__proto__"が入力された場合問題が発生する。
Object.create(null);を使うことにより、__proto__の無いオブジェクトが作成できる。
例
let obj3 = Object.create(null); // [[prototype]] が、nullになる
obj3.__proto__ = "TEST";
alert(obj3.__proto__); // TESTが表示される。
obj3.__proto__ = {
prop1 : "XXX"
};
alert(obj3.prop1); // undefined
alert(obj3.__proto__.prop1); // XXXが表示される。
0 件のコメント:
コメントを投稿