継承モード(下)

2826 ワード

Javascript継承モード(下)
聖杯モード
前の文章では、原型を共有した上で、自分で原型を修正しても、この原型を使用した他の構造関数に影響しないと述べました.
 

 Father.prototype.lastName = ' ';

 function Father() {

  }

  function Son () {

  }

  function inherit(Target, Origin) {

  function Lk() {};

  Lk.prototype = Origin.prototype;

  Target.prototype = new Lk();

        }

   inherit(Son, Father);//    

   var son = new Son();
   var father = new Father();//    
   
このときのSonのプロトタイプは継承されたFatherのプロトタイプであるため、制御セット動作Son.prototypeが出力するのはFather{…}である.
しかし,プロトタイプを修正すると,このプロトタイプを用いたコンストラクタには影響しない.
例えば、Son.prototype.name = demo;は次にソン.nameの値を出力します.出力fatherの値はundefinedです.他のコンストラクタに影響を与えません.
各プロトタイプにはコンストラクタがあります.コンストラクタのシステムには属性があります.
じゃ、問題が来ました.今のsonの構造関数は何ですか?
ソソンの構造関数はfunction Son () { }であるべきです.
しかし、son.com nstructorの出力はfunction Father () {}です.
Why
分析:
コントローラーはプロトタイプにしかない属性で、対象にはコントローラーという属性がないので、探しているコントローラーはプロトタイプのものです.
ソニーの原型はnew Lk()->new Lk()を対象にしていますが、中にはconstructorがありませんので、new Lk()の原型を探しています.
だから最後に、sonの構造関数はFatherの中のconstructorを探しています.だから、son.com nstructorが出力したのはfunction Father () {}So.
聖杯モードを完璧にしたいです.
sonのコンストラクタはfunction Son () { }であるべきです.それを変えたいです.
 

 Father.prototype.lastName = ' ';

 function Father() {

}

 function Son () {

 }

function inherit(Target, Origin) {

function Lk() {};

 Lk.prototype = Origin.prototype;

Target.prototype = new Lk();

 Target.prototype.constructor = Target;//            

Target.prototype.uber = Origin.prototype;//                 

 }

 inherit(Son, Father);//    

 var son = new Son();
 var father = new Father();//    
 
このときSonのコンストラクタは自分自身に変更されました.コンソール操作son.com nstructorの出力はfunction Son () { }です.
拡張(あってもなくても良い):
自分が作成したオブジェクトが自分のクラス(最終的に原型を継承)を見つけることができることを望んでいます.
 Target.prototype.uber = Origin.prototype;
以下は聖杯モードの最終的な形式です.この方法を直接呼んで参参してもいいです.
 function inherit(Target, Origin) {

 function Lk() {};

  Lk.prototype = Origin.prototype;

  Target.prototype = new Lk();

  Target.prototype.constructor = Target;//            

  Target.prototype.uber = Origin.prototype;//                 

        }
本節のポイント:
ヤフーYUI 3庫にはパッケージ機能の良いinheitがあり、非常に高い継承モデルです.
この操作を推奨します.
var inherit = (function () {

var Lk = function () {};//      。

return function (Target, Origin) {//  var Lk = function(){}       ,     inherit

Lk.prototype = Origin.prototype;

Target.prototype = new Lk();

Target.prototype.constructor = Target;

Target.prototype.uber = Origin.prototype; 

   }           

 }()); 

 inherit(Son, Father);  //    inherit。