Javascript原型(二)


図解の原型
function Person() {//TODO}
var p = new Person();
コードを実行する前に事前解析のプロセスが必要です.function Person(){}は関数宣言であり、pも声明であり(pは描かれていない)、前解析の時に声明が完成した.
  • メモリ状況
  • したがって、コードの開始時に、構造関数Personはメモリに既に存在していますので、コード実行の最初の文はvar p = new Person();プログラムの実行を開始します.
  • は、new作成オブジェクト
  • を実行する.
  • は、構造関数Personを実行し、オブジェクトの初期化(属性の追加)を実行する
  • .
  • メモリ状況
  • 変数p
  • に値を与えます.
  • は、コンストラクタに対して、Personタイプのオブジェクトはコンストラクタの実例となるオブジェクト
  • である.
  • 構造関数に対して、神秘的なオブジェクトは構造関数のプロトタイプ
  • である.
  • Personタイプのオブジェクトに対して、神秘的なオブジェクトはPersonタイプのオブジェクトの原型オブジェクト
  • である.
    /*        */
    Person.prototype.good = function() {console.log(" ");}
    p.good(); // 
    pが示すオブジェクトは、デフォルトでPerson.prototypeに接続され、Personのタイプのオブジェクトにはgoodの方法が存在しないが、pgoodの方法にもアクセスすることができ、これにより、現在のオブジェクトにある属性や方法が存在しない場合は、神秘的なオブジェクトを検索することができる.神秘的なオブジェクトから継承され、現在のオブジェクトの例は、元のオブジェクトから継承され、Person です.
  • 原型継承
  • なぜ原型を使うのですか?
  • どうして属性は普通原型に置かないですか?
  • 属性はオブジェクトの特徴を表しています.オブジェクト特有のものです.オブジェクトが異なり、属性も異なるはずです.しかし、原型に置くと、すべてのオブジェクトに共有されます.
  • どうして方法は原型に置くことができますか?
  • 属性は対象特有ですが、この対象の行為は同じであるべきです.例えば、人と人は違いますが、人は歩いたり食事をしたりします.これは行為です.すべての人は同じです.だから、原型に置いて多重化することができます.
  • プロトタイプ1、利用対象の動特性
    Student.prototype.sleep = function(){}
    、直接置換
    /*     .prototype.xxxx = vvvv */
    /*            */
    Student.prototype = {
        sleep: function(){}
        study: function(){}
    }
  • をどのように修正しますか?
  • 第一の方式は第二の方式と最大の違いは、第二の方式はまた一つのオブジェクトを作成し、元の原型オブジェクトを置換したので、今はもう二つのオブジェクトがメモリにあります.第一の方法は直接元のオブジェクトに属性
  • を追加することです.
    以下のテーマを分析します
    function Person() {}
    
    Person.prototype.func = function () {
        console.log("11111");
    };
    
    var p1 = new Person();
    
    Person.prototype = {
        func: function () {
            console.log("2222");
        }
    };
    
    var p2 = new Person();
    p1.func();
    p2.func();
  • 事前解析コンストラクタ
  • 構築関数のプロトタイプ属性付与値
  • var p 1=new Person();
  • プロトタイプの属性は、まず等号の右側のステートメントを実行します.つまり、メモリにオブジェクト
  • を作成しました.
  • var p 2=new Person();
  • このとき、構造関数のプロトタイプ属性は匿名のオブジェクトに向けられているので、新たに作成された タイプのオブジェクトのプロトタイプオブジェクトも匿名のオブジェクト
  • に向けられている.
  • は、図からPersonの実行結果がp1.func()であり、1111の実行結果がp2.func()
  • であることを知ることができる.
  • 2222