Jsプロトタイプチェーン

2470 ワード

自分がjsの原型に対する理解を記録して、まず何を見ますか?
function Foo(){}
Foo.prototype.num = 3;
// new Foo( )                   bar 
var bar = new Foo();
// bar            num ?
alert(bar.num); //3  
barにはnum属性がありません.ここでbarはプロトタイプチェーンを通じて価値プロトタイプチェーンを見つけました.JavaScriptの対象は特殊な__proto__に属性を内蔵しています.実は他の対象に対する参照です.私たちがfunctionキーを使って関数を宣言すると、システムは自動的にオブジェクトを作成します.このオブジェクトにアクセスすると、関数名.prototypeを介してアクセスできます.(私たちは一般的にこのオブジェクトをプロトタイプオブジェクトと呼びます.)newキーワードを使って関数を呼び出します.作成したオブジェクトをプロトタイプに関連付けるステップがあります.宣言関数で作成したオブジェクト(関数名.プロトタイプが指すオブジェクト)に関連します.
上の例ではnewキーワードを使ってFoo()関数を呼び出すとオブジェクトを作成します.私たちはこのオブジェクトをbarに割り当てました.barオブジェクト内部の__proto__属性は、ステートメント関数に関連して作成されたオブジェクト(Foo.prototype)、bar.num属性がbarに見つからない場合は、bar.__proto__にアクセスします.このプロセスは、マッチングされた属性名を見つけるか、プロトタイプチェーン(すべての一般的な「Prottype」チェーンは最終的にObject.prototypeを指します.)このため、上記の例のプロトタイプチェーンはこうです.
bar.__proto__ --    --> Foo.prototype --  (Foo.prototype.__proto__) --    --> Object.prototype
そのため、各構造関数にはプロトタイプオブジェクトがあり、プロトタイプオブジェクトはいずれもプロトタイプオブジェクトを指す内部ポインタを含んでいます.もし原型の対象を他のタイプの例に等しくしたら、結果はどうなりますか?この時のプロトタイプオブジェクトは、他のプロトタイプに向けられたポインタを含むことは明らかであり、それに応じて、他のプロトタイプにも、他のコンストラクタを指すポインタが含まれている.他のプロトタイプが別のタイプの例である場合、上記の関係は依然として成立しており、このように段階的に進行して、インスタンスとプロトタイプのチェーンを構成している.これがプロトタイプチェーンという基本概念です.プロトタイプについてもっと詳しく紹介します.ここを見てください.https://developer.mozilla.org...
プロトタイプチェーンの問題
1つ
参照タイプの値を含むプロトタイプの属性はすべてのインスタンスに共有されます.原型によって継承が実現されると、実際には別のタイプのインスタンスになります.したがって、元のインスタンス属性はそのまま現在のプロトタイプの属性になります.以下のコードはこの問題を説明するために使えます.
function SuperType(){   
  this.colors = ["red", "blue", "green"];
}
function SubType(){}//   SuperType
SubType.prototype = new SuperType();
var instance1 =newSubType();
instance1.colors.push("black");
//"red,blue,green,black"
alert(instance1.colors);
var instance2 = new SubType();
//"red,blue,green,black"
alert(instance2.colors);
SuperType立体関数は、1つの配列(参照タイプ値)を含むColors属性を定義しています.SuperTypeは各例に独自の配列を含むColors属性があります.SubTypeはプロトタイプチェーンを通じてSuperTypeを継承した後、SubType.prototypeはSuperTypeの一例となります.そのため、独自のColors属性を持っています.SubType.prototype.comを専門的に作成したのと同じです.SuperType.SuperTypeは何ですか?このcolors属性はすべての例で共有されますが、instance 1.co lorsの修正はinstance 2.colorsを通じて反映されますので、十分に確認されました.
二番目
サブタイプのインスタンスを作成する際には、超タイプの構造関数にパラメータを渡すことはできません.実際には、すべてのオブジェクトインスタンスに影響を及ぼさないように、超タイプの構造関数にパラメータを伝えることはできないということです.これに鑑みて、先ほど議論したプロトタイプの中に参照タイプの値が含まれているため、プロトタイプの問題は実際には単独で使用されることが少ないです.チェーン