まずこのコード部分を見てみましょう:
>
非常に単純なコードです。この新しい機能が正確に何をするのか見てみましょう。新しいプロセスは次の 3 つのステップに分割できます:
var p={}; つまり、オブジェクト p を初期化します。
<2> p.__proto__=person.prototype;
<3> つまり、p の構築は p の初期化とも言えます。
鍵は 2 番目のステップにあります。それを証明しましょう:
コードをコピーします
コードは次のとおりです。 : このコードは true を返します。ステップ 2 が正しいことを説明します。
それで、__proto__ とは何ですか?ここで簡単にお話しましょう。各オブジェクトはその内部の属性 (__proto__) を初期化します。オブジェクトの属性にアクセスするとき、この属性がオブジェクト内に存在しない場合、オブジェクトは __proto__ にアクセスして属性を見つけます。この __proto__ は独自の属性を持ちます。 __proto__ なので、それを探し続けます。これが、通常、プロトタイプ チェーンの概念と呼ばれるものです。
標準によれば、__proto__ は公開されていません。つまり、プライベート プロパティですが、Firefox エンジンはそれを公開し、外部からアクセスして設定できる共通プロパティにします。
さて、概念は明確です。次のコードを見てみましょう:
コードをコピーします
コードは次のとおりです:
この段落 コードは非常に単純です。誰もがこのように書いたと思います。それでは、なぜ p が person's Say にアクセスできるのかを見てみましょう。
最初の var p=new Person(); で p.__proto__=person.prototype を取得できます。次に、p.Say() を呼び出すと、まず p には Say 属性が存在しないため、__proto__ でそれを見つける必要があります。これは Person.prototype であり、上で Person.prototype( を定義しました)。 ){}; そこで、この方法を見つけました。
さて、次に、より複雑なことを見てみましょう。
コードをコピー
コードは次のとおりです:
この導出を実行しましょう:
var p=new Programmer() は p.__proto__=Programmer を取得できます。 .prototype;
上記で Programmer.prototype=new Person(); と指定しました。 var p1=new Person();Programmer.prototype=p1; とします。 p1.__proto__=Person.prototype;
Programmer.prototype.__proto__=Person.prototype;
上記によれば、p.__proto__=Programmer.prototype が得られます。 p.__proto__.__proto__=person.prototype を取得できます。
わかりました。明確に計算した後、上記の結果、p.Say() を見てみましょう。 p には Say 属性がないため、p1 である Programmer.prototype である p.__proto__ に移動します。そこで私はalert("人が言う")メソッドを見つけました。
残りは同じです。
これがプロトタイプチェーンの実装原理です。
最後に、プロトタイプは実際には単なる幻想であり、プロトタイプ チェーンを実現する際に補助的な役割を果たすだけです。つまり、プロトタイプ チェーンの本質は新しい場合にのみ存在します。 __proto__ にあります!