__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 件のコメント:
コメントを投稿