JS __proto__ の「楽しい」事実

__proto__
あなたが私を十分にフォローしてきたなら、あなたは私がいつもどれだけ反対してきたかをすでに知っています. :
const factory = (fields, {prototype} = Object) => ({
__proto__: prototype,
...fields
});
// mimic an <a /> reference
factory({href: '/'}, HTMLAnchorElement);

パフォーマンスはさておき、実際に使用することをまったく提案していないことに注意してください__proto__
。この投稿は別の理由で存在します。
Object.prototype.__proto__
__proto__ アクセサーが何をするかは誰もが知っていると確信しているので、挑戦を提案したいと思います…そして、はい、これはすべて有効な JS です。
class Test {}
const __proto__ = Test.prototype;
// what do these operations return?
({__proto__} instanceof Test);
({__proto__: __proto__} instanceof Test);
({"__proto__": __proto__} instanceof Test);
({["__proto__"]: __proto__} instanceof Test);
// what do these operations return?
({__proto__}.__proto__ === Test.prototype);
({__proto__: __proto__}.__proto__ === Test.prototype);
({"__proto__": __proto__}.__proto__ === Test.prototype);
({["__proto__"]: __proto__}.__proto__ === Test.prototype);
答えを知るためにこれらのスニペットを自分で実行していない場合は、私がお手伝いします! 最初の課題では、出力はfalse
、true
、true
となります。false
その理由は、 と の両方{__proto__}
が{["__proto__"]}
独自のプロパティとして定義されてObject.prototype.__proto__
いるためです。一方、構文による割り当ては、特別な構文機能を使用せず、引用符を使用しても、実際にはアクセサーを通過します。
一方、2 番目の課題 ( all ) では、直接アクセスするか as としてtrue
アクセスするかは問題ではないため、基本的には、セッターをトリガーできる方法と、ゲッターを 1 回トリガーできる方法には対称性がありません。それは自分の所有物か魔法の継承ゲートのどちらかです。__proto__
["__proto__"]
__proto__
__proto__
…そして__proto__だけではありません
私は自分で確認していませんが、すべてのレガシーの__xxx__
特別なアクセサーが同じ__proto__
呪いを受けていると信じています.これらのプロパティを賢く割り当ててください。
そして、それはすべての人々です!
この投稿の唯一のポイントは、次のように要約されている可能性があります。
- 新しい構文でこれらがどのように動作するかについて、今日または明日の驚きを避けたい場合は、言語のレガシーでまだ機能している部分を使用しないでください。
Object.setPrototypeOf
オブジェクトのプロトタイプを手動で設定することが厳密に必要な場合はいつでも明示的な(そして残念ながら遅い)ことを好みますが、可能な限り他のすべてのケースでクラスを使用してください- この投稿を記憶から消去するか、次のような短い文に縮小してください。
__proto__