JS __proto__ の「楽しい」事実

Nov 26 2022
あなたが私を十分にフォローしてくれているなら、あなたは私が __proto__ にどれほど反対してきたかをすでに知っているでしょう.許容可能: パフォーマンスはさておき、実際に __proto__ を使用することをまったく提案していないことに注意してください。この投稿は他の理由で存在します。物体。
UnsplashのMarkWilliamsによる写真

__proto__あなたが私を十分にフォローしてきたなら、あなたは私がいつもどれだけ反対してきたかをすでに知っています. :

const factory = (fields, {prototype} = Object) => ({
  __proto__: prototype,
  ...fields
});

// mimic an <a /> reference
factory({href: '/'}, HTMLAnchorElement);

Firefox では、__proto__ のスコアが new Class よりも優れています

パフォーマンスはさておき、実際に使用することをまったく提案していないことに注意してください__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);

答えを知るためにこれらのスニペットを自分で実行していない場合は、私がお手伝いします! 最初の課題では、出力はfalsetruetrueとなります。falseその理由は、 と の両方{__proto__}{["__proto__"]}独自のプロパティとして定義されてObject.prototype.__proto__いるためです。一方、構文による割り当ては、特別な構文機能を使用せず、引用符を使用しても、実際にはアクセサーを通過します。

一方、2 番目の課題 ( all ) では、直接アクセスするか as としてtrueアクセスするかは問題ではないため、基本的には、セッターをトリガーできる方法と、ゲッターを 1 回トリガーできる方法には対称性がありません。それは自分の所有物か魔法の継承ゲートのどちらかです。__proto__["__proto__"]__proto____proto__

…そして__proto__だけではありません

私は自分で確認していませんが、すべてのレガシーの__xxx__特別なアクセサーが同じ__proto__呪いを受けていると信じています.これらのプロパティを賢く割り当ててください。

そして、それはすべての人々です!

この投稿の唯一のポイントは、次のように要約されている可能性があります。

  • 新しい構文でこれらがどのように動作するかについて、今日または明日の驚きを避けたい場合は、言語のレガシーでまだ機能している部分を使用しないでください。
  • Object.setPrototypeOfオブジェクトのプロトタイプを手動で設定することが厳密に必要な場合はいつでも明示的な(そして残念ながら遅い)ことを好みますが、可能な限り他のすべてのケースでクラスを使用してください
  • この投稿を記憶から消去するか、次のような短い文に縮小しください__proto__