这次使用“ 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”测试不能正确,否则,它是可用的。但“instancof”不正确是一个主要缺点。
//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()); 是因为我希望所有“instancof”子句都为真,否则,我会做 SuperFuncRef().apply(this),首先将所有函数复制到“this”中,然后进行本地覆盖。因此新的 F() 只是 F 的一个实例,这不是我想要的。
谢谢你的关注。如果你不关心,或者认为不值得,请别管它,不要浪费更多时间去down_vote它,我处于边缘,或者你可以通过在下面评论来教我英语语法。我会一次又一次地重新格式化,直到你满意为止,尽管你给出了答案。