JavaScriptにおける継承の原型チェーン

2736 ワード

「JavaScript高級プログラム設計」に関わる継承方式:プロトタイプチェーン、プロトタイプ継承、寄生式継承、プロトタイプ継承、寄生式継承.
大丈夫です.初めて見たのも実力がないです.その後何度も繰り返して勉強しましたが、ようやく分かりました.
一.プロトタイプチェーン:
原型はただ多く紹介しました.時間があればブログを書いてまとめます.
実現の本質は原型オブジェクトの書き換えです.原型オブジェクトの書き換えは何ですか?オブジェクトの文字の量を元のオブジェクトの属性と方法を再定義します.
たとえば:
function Person{
}
Person.prototype = {
    name : "Nico",
    age : 20,
    job : "FE",
    sayName :  function(){
        alert(this.name);
    } 
}
以上対象の字面量で原型の対象を書き直した後、原型の対象のconstructorはPersonを指しなくなりました.関数を作成するごとにプロトタイプのオブジェクトを作成します.このオブジェクトも自動的にconstruct属性を獲得します.したがって、新しいプロトタイプのオブジェクトのconstructは現在Objectコンストラクタを指しています.このように[Enumerable]の特性をtrueに設定します.Object.defineProperty()で設定できます.具体的には拡大しません.
ここで特に言及したのは、インスタンスを作成してから元のオブジェクトに戻したら、インスタンスは元のオブジェクトに指します.したがって、インスタンスは、新しい追加の方法と属性を呼び出すことができません.したがって、プロトタイプチェーンによって継承される場合は、対象の字面量を使ってプロトタイプを作成することはできません.
はい、引き続き原型チェーンの継承を話します.実施形態は、原型オブジェクトを他のタイプに等しくする例である.結果はどうなりますか?この時のプロトタイプオブジェクトは他のプロトタイプを指すポインタを含んでいます.したがって、他のプロトタイプには他のコンストラクタを指すポインタconstructorも含まれています.このようにして、いくつかの段階で、インスタンスとプロトタイプのチェーンを構成します.
まず例を見ます.
function superType(){
    this.property = true;
}

superType.prototype.getSuperValue = function(){
    return this.property;
}

function subType(){
    this.subproperty = false;
}

//   superType
subType.prototype = new superType();

subType.prototype.getSubValue = function(){
    return this.subProperty;
}

var instance = new subValue();
alert(instance.getSuperValue);
以上のコードはsubTypeデフォルトで提供されたプロトタイプを使っていません.新しいプロトタイプ、すなわちsuperTypeの例を変えました.このようにsubTypeのプロトタイプオブジェクトには、superTypeのプロトタイプがsuperTypeの例であるため、例示的な属性および方法が自然にインスタンスに追加される.subTypeのプロトタイプオブジェクトも一つ多くなります.このようにプロトタイプチェーンを形成して、インスタンスinstanceがget SuperType()メソッドにアクセスすると、3つのステップがあります.(1)検索例、(2)subType.prototypeを検索します.(3)superT.prototypeを検索します.検索過程はプロトタイプチェーンの端まで一环で進めば止まります.(instance.co nstructorは現在、superTypeを指しています.subTypeの原型は別の対象のsuperTypeの原型を指しています.superTypeの原型のconstructorはsuperTypeを指しています.)
二.デフォルトの原型を忘れないでください.
すべての関数のデフォルトのプロトタイプはObjectの例ですので、デフォルトのプロトタイプは内部ポインタを含み、Object.prototypeを指します.
三.原型と実例の関係を確定する:
1>instance of()操作符を使用します.このオペレータでインスタンスとプロトタイプチェーンに現れた構造関数をテストすると、結果はtrueに戻ります.
alert(instance instanceof Object) //true
alert(instance instanceof superType) //true
alert(instance insatanceof subType) //true
2>isPrototypeOf()方法を使用します.プロトタイプチェーンに出現したプロトタイプであれば、そのプロトタイプチェーンが派生した例のプロトタイプといえる.
alert(Object.prototype.isPrototypeOf(instance)) //true
alert(superType.prototype.isPrototypeOf(instance))  //true
alert(subType.prototype.isPrototypeOf(instance)) //true
四.プロトタイプチェーンの問題
1>参照タイプの値を含むプロトタイプの属性は、すべてのインスタンスで共有されます.
2>サブタイプのインスタンスを作成するときは、超タイプの構造関数にパラメータを渡すことができません.