今回「 proto 」を使用する主な理由は、継承定義を関数定義内に保持しようとすることです。
関数 def の外側の継承を設定し、「this.xxx」を介して「パブリック フィールド」にのみアクセスする関数に対してのみ機能し、Inheriting_FuncDef は SuperFuncDef の拡張知識を持っている必要があります。
var G=function (){
var g1state=0;
this.g1=function(){
return g1state++;
}
};
var E = function (){
var e2state=0;
this.e2=function(){
return e2state++;
}
};
E.prototype=new G();
var F= function (){
var f3state=0;
this.f3=function(){
return f3state++;
}
};
F.prototype=new E();
var xx = new F();
var xx2= new F();
console.log("xxg1:___"+xx.g1());//0
console.log("xxg1:___"+xx.g1());//1
console.log("xx2g1:___"+xx2.g1());//2 , need it to be 0, don't wanna share same super() instance/and closure.
console.log("xxe2:___"+xx.e2());//0
console.log("xxe2:___"+xx.e2());//1
console.log("xx2e2:___"+xx2.e2());//2 , need it to be 0;don't wanna share same super() instance/and closure.
console.log("xxf3:___"+xx.f3());//0
console.log("xxf3:___"+xx.f3());//1
console.log("xx2f3:___"+xx2.f3());//0 this f3() is not inherited from super(), and have the expected result.
console.log(xx);
console.log("xx instanceof E:___"+(xx instanceof E));//ture
console.log("xx instanceof F:___"+(xx instanceof F));//true
console.log("xx instanceof G:___"+(xx instanceof G));//ture
「改良版」の唯一の欠点は、「instancof」テストが正しくないことです。それ以外の場合は、使用できます。しかし、「instantcof」の誤りは大きな欠点です。
//i test it in ie 11, the result is the same.
var G=function (){
var g1state=0;
this.g1=function(){
return g1state++;
}
};
var E = function (){
Object.setPrototypeOf(this,new G());
var e2state=0;
this.e2=function(){
return e2state++;
}
};
//E.prototype=new G();
var F= function (){
Object.setPrototypeOf(this,new E());
var f3state=0;
this.f3=function(){
return f3state++;
}
};
//F.prototype=new E();
var xx = new F();
var xx2= new F();
console.log("xxg1:___"+xx.g1());//xxg1:___0 ,expected.
console.log("xxg1:___"+xx.g1());//xxg1:___1 ,expected.
console.log("xx2g1:___"+xx2.g1());//xx2g1:___0 ,expected.
console.log("xxe2:___"+xx.e2());//xxe2:___0 ,expected.
console.log("xxe2:___"+xx.e2());//xxe2:___1 ,expected.
console.log("xx2e2:___"+xx2.e2());//xx2e2:___0 ,expected.
console.log("xxf3:___"+xx.f3());//xxf3:___0 ,expected.
console.log("xxf3:___"+xx.f3());//xxf3:___1 ,expected.
console.log("xx2f3:___"+xx2.f3());//xx2f3:___0 ,expected.
console.log(xx);
console.log("xx instanceof E:___"+(xx instanceof E));//xx instanceof E:___false , expect to be true
console.log("xx instanceof F:___"+(xx instanceof F));//xx instanceof F:___false, expect to be true
console.log("xx instanceof G:___"+(xx instanceof G));//xx instanceof G:___true
したがって、どちらの方法でも完璧な結果を生み出すことはできません。そして、継承セットアップの「Funcref.prototype=new superFuncref()」方法は基本的に機能しないと思います。
そして、私が Object.setPrototypeOf(this,new SuperFuncRef()); を行う唯一の理由は これは、すべての「instantcof」句を true にしたいためです。それ以外の場合は、SuperFuncRef().apply(this) を実行し、最初にすべての関数を「this」にコピーしてから、ローカル オーバーライドを実行します。したがって、新しい F() は F のインスタンスにすぎません。それは私が望んでいたものではありません。
お気遣いありがとうございます。気にしない、または価値がないと思う場合は、放っておいてください。これ以上反対票を投じるのに時間を無駄にしないでください。あなたが答えを出すかどうかにかかわらず、あなたが満足するまで何度でも再フォーマットします。