Der Hauptgrund, " proto " dieses Mal zu verwenden, besteht darin, zu versuchen, die Vererbungsdefinition innerhalb der Funktionsdefinition beizubehalten:
Die Vererbung außerhalb der Funktionsdefinition einzurichten funktioniert nur für Funktionen, die nur auf "öffentliche Felder" über "this.xxx" zugreifen, und die vererbende Funktionsdefinition muss das erweiternde Wissen der Superfunktionsdefinition haben, da sonst die "öffentlichen Felder" kollidieren könnten:
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 , benötige es, um 0 zu sein, möchte nicht dieselbe super() -Instanz / und closure teilen.
console.log("xxe2:___"+xx.e2());//0
console.log("xxe2:___"+xx.e2());//1
console.log("xx2e2:___"+xx2.e2());//2 , benötige es, um 0 zu sein; möchte nicht dieselbe super() -Instanz / and closure teilen.
console.log("xxf3:___"+xx.f3());//0
console.log("xxf3:___"+xx.f3());//1
console.log("xx2f3:___"+xx2.f3());//0 diese f3() wird nicht von super() geerbt und hat das erwartete Ergebnis.
console.log(xx);
console.log("xx instanceof E:___"+(xx instanceof E));//true
console.log("xx instanceof F:___"+(xx instanceof F));//true
console.log("xx instanceof G:___"+(xx instanceof G));//true
Die einzige Einschränkung für die "verbesserte Version" scheint zu sein, dass der "instancof" -Test nicht richtig sein kann, ansonsten ist sie verwendbar. Aber die Falschheit von "instancof" ist ein großer Nachteil.
//Ich habe es in IE 11 getestet, das Ergebnis ist dasselbe.
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 ,erwartet.
console.log("xxg1:___"+xx.g1());//xxg1:___1 ,erwartet.
console.log("xx2g1:___"+xx2.g1());//xx2g1:___0 ,erwartet.
console.log("xxe2:___"+xx.e2());//xxe2:___0 ,erwartet.
console.log("xxe2:___"+xx.e2());//xxe2:___1 ,erwartet.
console.log("xx2e2:___"+xx2.e2());//xx2e2:___0 ,erwartet.
console.log("xxf3:___"+xx.f3());//xxf3:___0 ,erwartet.
console.log("xxf3:___"+xx.f3());//xxf3:___1 ,erwartet.
console.log("xx2f3:___"+xx2.f3());//xx2f3:___0 ,erwartet.
console.log(xx);
console.log("xx instanceof E:___"+(xx instanceof E));//xx instanceof E:___false , sollte true sein
console.log("xx instanceof F:___"+(xx instanceof F));//xx instanceof F:___false, sollte true sein
console.log("xx instanceof G:___"+(xx instanceof G));//xx instanceof G:___true
Also kann keiner der Wege das perfekte Ergebnis liefern. Ich denke, die Vererbungseinrichtung durch "Funcref.prototype=new superFuncref()" funktioniert im Grunde nicht für mich.
Der einzige Grund, warum ich Object.setPrototypeOf(this,new SuperFuncRef()); mache, ist, dass ich möchte, dass alle "instancof" -Klauseln wahr sind, sonst würde ich SuperFuncRef().apply(this) machen, alle Funktionen in "this" kopieren und dann die lokale Überschreibung durchführen. Daher ist new F() nur eine Instanz von F, das ist nicht das, was ich wollte.
Danke für deine Aufmerksamkeit. Falls es dir egal ist oder du es nicht für wichtig hältst, lass es einfach in Ruhe, verschwende keine Zeit damit, es abzulehnen. Ich stehe kurz davor, oder du kannst mir englische Grammatik beibringen, indem du unten kommentierst. Ich werde es immer wieder neu formatieren, bis du zufrieden bist, ob du eine Antwort gibst oder nicht.