JavaScriptの原型(鎖)&継承(一)

7604 ワード

Zeeの話があります以下の内容の大部分は「Professional JavaScript for Web Developers」と「JavaScript言語精粋とプログラミング実践」から抜粋します.本の中のいくつかの概念を結び付けて、本の中の知識に対する理解を総括しました.自分の回顧と多くの友達を助けるために.正確ではないところがありますので、交流して検討したいです.
博文関連内容解析:コンストラクタ–コンストラクタ——(コンストラクタが実際にコンストラクタを指す)
原型オブジェクト
JavaScriptの対象者向け
一般的に私たちが言っている「対象向け」には、パッケージ、継承、多状態の三つの基本的な特性があります.三つの特性が満足する場合、対象言語と呼び、一部の特性を満たす言語を「対象言語に基づく」と言います.ECMA-622は対象を「無秩序属性の集合」と定義します.その属性は基本値、対象または関数を含むことができます.「オブジェクトに相当する値は、特定の順序がないグループの値です.オブジェクトの属性と方法には名前があります.名前ごとに1つの値にマッピングされます.ECMAScriptのオブジェクトは、ハッシュリストとして理解できます.名前のペアだけでなく、値はデータと関数となります.各オブジェクトは、参照の種類に基づいて作成されます.元のタイプでもいいし、開くこともできます.発注者定義のタイプ.
オブジェクトを理解する
カスタムオブジェクトを作成する最も簡単な方法は、Objectのインスタンスを作成し、属性と方法を追加することです.
var person = new Object();
person.name = "Zee";
person.age = 20;
person.job = "beginner";

person.sayName = function(){
    alert(this.name);
}
オブジェクトの文字数を作成
var person = {
    name:"Zee",
    age:20,
    job:"beginner",
    sayName:function(){
        alert(this.name);
    }
};
personというオブジェクトを作成し、三つの属性と一つの方法を追加しました.
原型を提出する
いずれにしても、新しい関数を作成すると、特定のルールのセットに従ってプロトタイプの属性を作成します.この属性指向関数のプロトタイプのオブジェクトです.デフォルトでは、すべてのプロトタイプのオブジェクトが自動的に一つのconstrutorを取得します.この属性はプロトタイプの属性の所在関数を指すポインタです.Person.prototype.com nstructorはPersonを指します.このコンストラクタを通して、プロトタイプのオブジェクトに他の属性と方法を追加することもできます.
Person
2
プロトタイプ
1
——————————————————————————————————————————————————————————————————————————————————
Person Prottype
1
トラック
2
name
「ZE」
メッセージ
20
job
「beginner」
sayName()
(function)
person 1
[Prototype]
1
表の対応する数字はポインタ接続であり、Personコンストラクタ、Personのプロトタイプ属性、Personの既存の2つのインスタンスの関係を示しています.ここでPerson.prototypeはプロトタイプオブジェクトを指しています.Person.prototype.comはPersonに戻りました.プロトタイプのペアにはconstructor属性が含まれているほか、後に追加されたPersonの属性も含まれています.たとえば、person 1とperson 2はいずれもPerson.prototypeを指す内部属性を含み、言い換えれば、それらは構造関数と直接関係がない.
また、プロトタイプは最初はconstructor属性のみを含み、この属性も共有されているので、対象インスタンスを通じてアクセスすることができる.
_proto_とprototypeの属性の違い
ユンプロモーション属性はFirefox、Safari、Chromeでサポートされています.(IEを除く)
protptype         ,_proto_          。prototype             ,_proto_                [[Prototype]]  。              _proto_  ,             prototype  ,             。
[[Prototype]] = _proto_;
person1._proto_ = Person.prototype;
Person.prototype.constructor = Person;
以上のコードは理解を助けます.
原型引継ぎ
「対象システム」の継承特性には、クラスベース、プロトタイプベース、タプルベースの3つの実装があります.JavaScriptはプロトタイプ継承を使用して対象システムを実現します.したがって、JavaScriptはクラスがありません.「コンストラクター」という機構を採用して、クラスのいくつかの機能を実現します.オブジェクトの特性は、コンストラクターまたは構造機構によってもたらされます.
空のオブジェクト(null)と空のオブジェクト
オブジェクトが空です
  • は予約文字として使われています.
  • はオブジェクトタイプ
  • に属します.
  • オブジェクトは、空の値の
  • である.
  • for...in列挙
  • これはobject(またはそのサブクラス)の例からではないので、instance of演算はfalseに戻ります.
    空のオブジェクト
    は、標準的な、object()によって構成されるオブジェクトの例です.
    Obj=new Object();
    を使用して得られたobjの例を示します.また、オブジェクト直接量も、実例を作成するためにobject()を暗黙的に呼び出します.したがって、以下のコードも「空のオブジェクト」を得ることができます.
    obj={}
    空のオブジェクトは「オブジェクト」のすべての特性を持っています.したがって、属性や方法(totring、valueofなど)にアクセスできます.instance of演算もtrueに戻ります.
    原型継承の基本的性質
    オブジェクトにはプロトタイプがありません.プロトタイプはプロトタイプがあります.プロトタイプはオブジェクトの例です.プロトタイプはプロトタイプを指します.プロトタイプの意味は、コンストラクタ(コンストラクタ)の場合です.プロトタイプオブジェクトAを指すと、このコンストラクタによって作成された例は必ずAからコピーされます.インスタンスはオブジェクトAからコピーされるので、インスタンスは必ずAの属性、方法、およびその他の性質をすべて引き継ぎます.
    空のオブジェクトはすべてのオブジェクトの基本です.
    //     
    proto = Object.prototype;
    //         
    var num = 0;
    for(var n in proto){
        num++;
    }
    //    
    alert(num);
    Object()コンストラクタの原型は空の対象です.
    原型継承の本質は「複製」です.
    obj1 = new Object();
    obj2 = { };
    上記はすべてObject.prototypeから「対象」のイメージをコピーしたものに過ぎません.それらも空の対象です.(ここの概念は絶えず正しく、具体的に原型継承の実現内容に含まれています.)そのため、対象の「構築過程」は簡単に「複製」として捉えられます.
    Object.prototypeコピー=>obj 1=clone(prototype)
    原型継承の実現
    JavaScriptは、読経機構により実現されたプロトタイプを継承します.コピーされた粒度をプロトタイプからメンバーに変えました.つまり、オブジェクトを書く必要があります.のプロパティをコピーする必要はなく、後の操作がイメージに向けられます.インスタンスメンバーを書くときだけ、メンバーの情報をインスタンス映像にコピーします.Object.prototype=>obj 1=>|名|値𞓜タイプ
    Obj 1はまだプロトタイプへの参照であり、操作中もプロトタイプと同じサイズのオブジェクトインスタンスが作成されていないことが分かりました.書き込み操作は大量のメモリ割り当てを引き起こしず、経済的にメモリを使用しました.しかし、Obj 1(およびすべての対象事例)メンバー表を維持する必要があります.このメンバーリストは、Obj 1で修正されたメンバー名、値とタイプを指します.この表は原型と一致するかどうかは重要ではありませんが、2つのルールに従います.読み取り時にまずアクセスすることを保証します.対象に属性が指定されていない場合は、オブジェクト全体のプロトタイプチェーン(後述)を参照してください.プロトタイプが空になるまで.またはこの属性を見つけます.
    プロトタイプ継承の実現ルールを総括すると、「オブジェクトは何ですか?」とは関係ありません.オブジェクトのメンバーのアクセス規則と、これらのメンバーを格納する際のデータ構造の約束です.アクセスインスタンスの属性は、アクセスプロトタイプの中の属性より効率が高いです.ポインタが少ないためです.
    コンストラクタ(コンストラクタ)と一般関数
    //  _proto_        ,get_prototype()      。
    var _proto_ = null;
    function get_prototype(){
        if(!_proto_){
            _proto_ = new Object();
            _proto_.constructor = this;
        }
        return _proto_;
    }
    上記の例では、関数はプロトタイプに引用する必要があるときのみ、コンストラクタの特性を持ちます.つまり、一般関数からコンストラクタへの変換はプロトタイプの参照が必要です.
    関数のプロトタイプは常に標準的で、システムに内蔵されているobject()ビルダーの例ですが、作成後のconstruct属性は常に現在(構造)関数に割り当てられています.delete演算子は常に現在の属性を削除して、メンバーに親タイプの属性値にアクセスさせることができます.
    function MyObject(){
        //1、  true,        (      constructor)    (  )    
        alert(MyObject.prototype.constructor == MyObject);
        //2、     
        delete MyObject.prototype.constructor;
        //3、                  
        //(   true)
        alert(MyObject.prototype.constructor == Object);
        alert(MyObject.prototype.constructor == new Object().constructor);
    }
    オブジェクトインスタンスの基本構成
    構造関数の特徴とプロトタイプの継承の実現についての理解を深めた後、それらの内在的な関係について議論し続けます.JavaScriptの対象例は本質的には「プロトタイプを指し、属性リストを持つ構造」です.
    オブジェクトインスタンス自体には特別な性質はありません.構造体のように、すべてのオブジェクトの性質は、システムのプロトタイプとメンバーリストの理解から生まれています.現在は「空のオブジェクトはすべてのオブジェクトの基礎」を理解しています.つまり、Object.prototypeはすべてのオブジェクトの最上位のプロトタイプです.「空のオブジェクト」以下の条件を満たす構造にすぎない.
  • オブジェクトインスタンスが指すプロトタイプは、object.prototypeである.
  • オブジェクト例のメンバリストは、空のテーブル
  • を指す.