javascriptはどのように継承されていますか?

4321 ワード

最初の段階:
 
  
function A(){
this.funB = function(){
alert('A:funB');
};
}
A.prototype = {
funA:function(){
alert('A:funA');
}
};
function B(){
}
function extend(sub,parent){
sub.prototype = new parent();
sub.prototype.constructor = sub;
}
extend(B,A);
var b = new B();
b.funA(); // out 'A:funA'
b.funB(); // out 'A:funB'
alert(b instanceof A); // out "true"
皆さんは一目で何の意味が分かりますか?まずA、Bの二つの種類を定義して、extedの方法を使って、BにA類を継承させます.extedの原理は、親のnewを子タイプのプロトタイプにすることです.
instance ofで検出してもtrueです.instance ofをtrueとするには、二つの種類のprototypeの対象が同じOB jectである必要があります.間接でも直接でもいいです.
このような方法は問題がありますか?通常のオブジェクト指向言語では、サブクラスは親タイプを継承する際に、親タイプの構造関数の実行をトリガしません.ここでは親タイプが継承時に実行されます.
第二段階
 
  
function A(){
this.Astr = 'hello A';
}
A.prototype = {
funA:function(){
alert(this.Astr);
}
};
function B(){
arguments.callee.superclass && arguments.callee.superclass.apply(this,arguments);
this.Bstr = 'hello B';
}
B.prototype = {
funB:function(){
alert(this.Bstr);
}
};
function C(){
arguments.callee.superclass && arguments.callee.superclass.apply(this,arguments);
alert(this.Astr);
alert(this.Bstr);
}
function extend(sub,parent){
var subproto = sub.prototype;
sub.prototype = parent.prototype;
typeof subproto != 'object' && (subproto = {});
typeof sub.prototype != 'object' && (sub.prototype = {});
for(var i in subproto){
sub.prototype[i] = subproto[i];
}
sub.superclass = parent;
}
//B A
extend(B,A);
//C B
extend(C,B);
var c = new C(); // out 'hello A','hello B'
c.funA(); //out 'hello A'
c.funB(); // out 'hello B'
alert(c instanceof A) // out true
alert(c instanceof B) // out true;
ここでexted方法に対していくつかの変更を行いました.ここではサブクラスごとにsuperclassの属性を持っています.彼女が継承した父親クラスを引用して、父親クラスのプロトタイプを空の関数prototypeで獲得して、サブクラスのprototypeに実例化します.
サブクラスのコンストラクタの中で、必要とする父のコンストラクタを実行するためのコードを使用します.
 
  
arguments.callee.superclass && arguments.callee.superclass.apply(this,argumengs);
これでクラスの継承が完了しました.
上のコードに対して、より便利な継承書き方がありますか?Functionの原型を修正してみてください.
 
  
Function.prototype.extend = function(parent){
var subproto = this.prototype;
this.prototype = parent.prototype;
typeof subproto != 'object' && (subproto = {});
typeof this.prototype != 'object' && (this.prototype = {});
for(var i in subproto){
this.prototype[i] = subproto[i];
}
this.superclass = parent;
return this;
}
function A(){
this.Astr = 'hello A';
}
A.prototype = {
funA:function(){
alert(this.Astr);
}
};
var B = function(){
arguments.callee.superclass && arguments.callee.superclass.apply(this,arguments);
this.Bstr = 'hello B';
}
B.prototype = {
funB:function(){
alert(this.Astr);
}
};
B.extend(A);
var C = function(){
arguments.callee.superclass && arguments.callee.superclass.apply(this,arguments);
alert(this.Astr);
alert(this.Bstr);
}.extend(B);
var c = new C(); // out 'hello A','hello B'
c.funA(); //out 'hello A'
c.funB(); // out 'hello B'
alert(c instanceof A) // out true
alert(c instanceof B) // out true;
ここのextedでやっていることは、サブタイプのプロトタイプを引用して、サブタイプのプロトタイプを親タイプのプロトタイプの対象に向けると、親タイプを継承します.そしてsubprotoを経て、元プロtypeのメンバーを現prototypeに追加します.このような重名のメンバーは親タイプのメンバーをカバーします.最後にサブクラスの属性superclassを親類に向ける.
js継承の鍵はプロトタイプチェーンの唯一性を維持することであり、instance ofはインスタンスを判断することである.プロト.親タイプのプロトタイプと同じObjectかどうか.
作者cnblogs OD