javascriptのオブジェクト指向プログラミングの属性継承


もっと読む
関数の継承は2種類に分けられます.1、そのthis属性を継承する2、プロトタイプの属性を継承します.
この論文では第一の状況だけを論じる.
を選択します.
JavaScriptでは、キーワードを引き継いでいません.では、どのような方法でオブジェクトをコンストラクタで生成する場合、オブジェクトを別のコンストラクタに基づいて属性の生成(継承/コピー)を行いますか?つまり、一つの関数にnewキーワードを使ってオブジェクトを生成する場合、そのオブジェクトの属性は他の関数から来ることができます.
本文は二つの書き方を提供します.
最初の(非公式):
しかし、この用法を理解する必要があります.
function Animal (name, age){
   this.name = name;
   this.age = age;
}

function Dog (name, age){
   this.i = Animal;
   this.i(name, age);
}

d = new Dog('hello',20);

console.log(d);

/*

Dog {name: "hello", age: 20}
    age: 20
    i: function Animal(name, age)
    name: "hello"
    __proto__: 
        constructor: function Dog(name, age)


*/
上記の表記は外部関数Animalを自分の内部メンバー関数として参照してください.
これは匿名関数の書き方です.
相当于:
function Dog (name, age){
   this.i = function Animal (name, age){
       this.name = name;
       this.age = age;
   }
   this.i(name, age);
}
相当于:

function Dog (name, age){
   /*
   When calling a function, instead of using the 'new' keyword to create
   object, 

              // Calling a function 
              Animal();

              //Using the 'new' keyword to create object.
              new Animal();


   The inner 'this' is the same one of the outer 'this'. Because 
   there is no 'this' object created inside of the function, so it has to 
   refer to the outer one.
   */
   
   this.i = function (name, age){
       this.name = name;           // 2. so the inner "this" is the same 
       this.age = age;             // one of the outer "this".
   }
   this.i(name, age);              // 1. function call, no 'this' created.

}                                  
思考:
関数を呼び出した時、「this」は誰ですか?
関数呼び出しは、「this」オブジェクトを生成しません.
では、直接Docg内でAnimalを呼び出してもいいですか?
答え:いいえ

/*
  The called function belongs to which, the inner 'this' inside of
  the called function refers to that object.
*/

function Dog (name, age){ // if call Animal directly,
    Animal(name,age);     // the Animal function here belongs to 'window',
}                         // so 'this' inside of Animal refers to 'window'
    等価:

function Dog(name, age){
    window.Animal(name, age);  // "this" refers to "window" object.
}
第二種類(正式):
関数またはcall()関数を使用します.
apple():appy“this”object to the(that)function,then cal it.

function Animal (name, age){
   this.name = name;
   this.age = age;
}

function Dog (name, age){
   Animal.apply(this, arguments);  // apply "this" object to Animal function.  
                                   // or  
                                   // call Animal function with a given 'this' 
                                   // object, instead of referring to other 'this'.
}

d = new Dog('hello',20);

console.log(d);

/*

Dog {name: "hello", age: 20}
    age: 20
    name: "hello"
    __proto__: 
        constructor: function Dog(name, age)


*/

console.log(d instanceof Dog);  // true

//
結語:
このようなthisオブジェクトの継承方式には問題がありません.
しかし、それは欠点があります.繰り返します.
このような欠点は以下の点において特に顕著である.
    1、属性は文字タイプですが、公有です.
    2、属性は関数タイプです.
たとえば:

function Person(){
    this.type = "human";
    this.sayHello = function(){
       return "Hello"; 
    }
}
上のように属性type、sayHelloをprototypeに設定した方がいいです.

function Person(){
    // this.name = "xxx";
}
Person.prototype.type = "human";
Person.prototype.sayHello = function(){
    return "Hello"; 
}
問題:他の関数のprototype属性はどうやって継承しますか?
引き続き読んでください.
—————————————
javascript関数の基礎シリーズの文章
1、JavaScriptの変数のスコープ
2、javascriptの変数タイプと変数宣言と関数変数の運行メカニズム
3、javaScriptのfunction定義
4、javascriptのfunctionのprototype対象
5、javascriptのfunctionのクローズド特性
6、javascriptのfunctionのthis   
7、javascriptのfunctionのアプリ()、call()
_う呷
javascript対象向けプログラミングシリーズの文章:
    1、javaScriptの対象向けプログラミング
    2、javascriptの対象向けプログラミングの属性継承
    3、javascriptの対象向けプログラミングの原型継承 
   
を選択します.
を選択します.
転載は明記してください
原文の出所:http://lixh1986.iteye.com/blog/2332467
を選択します.
を選択します.