2021年2月14日日曜日

javascript の特殊なプロパティー __proto__

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

コメントを投稿