我用类似这样的函数创建一个类
var Obj=function(){this.children=[];this.parent=null;}//a base class
Obj.prototype.index=function(child){
// the index of current obj
if(arguments.length==0){
return this.parent?this.parent.index(this):0;
}
// the index of a child matchs specific obj [to be override]
return -1;
}
基本上它只是一个由index()和index(child)组成的重载函数。 然后我创建一个子类,SubObj或其他什么,继承自Obj
SubObj.prototype.prototype=Obj;
现在,是时候覆盖索引(子)函数了,但是,index()也在函数中,我也不想覆盖它。
一种解决方案是像这样写
var Obj=function(){this.children=[];this.parent=null;}//a base class
Obj.prototype.index=function(child){
// the index of current obj
if(arguments.length==0){
return this.parent?this.parent.index(this):0;
}
// the index of a child matchs specific obj [to be override]
return this._index(this);
}
Obj.prototype._index=function(this){
return -1;
}
SubObj.prototype._index=function(this){/* overwriteing */}
但是这很容易误导其他编码器,因为_index(child)应该是私有的(除了index()函数之外不应该使用)和public(是index()的重载函数,这是公共的)
你们有更好的主意吗?答案 0 :(得分:0)
根据我的理解,你要做的事情应该是非常可行的。虽然,我会接受RobG的建议,并试图将经典设计强制转换为JavaScript; JavaScript是关于对象,而不是类。无论如何,我离题了。这是您可以尝试的解决方案:
var Obj = function () {
this.children = [];
this.parent = null;
};
Obj.prototype.index = function (child) {
if (arguments.length === 0) {
return this.parent ? this.parent.index(this) : 0;
}
return -1;
};
var SubObj = function() {};
SubObj.prototype = new Obj();
SubObj.prototype.index = (function (base) {
var someIndex = 10;
return function (child) {
// If child is defined then we
// do our own processing.
if (child && arguments.length === 1) {
return someIndex;
}
// Otherwise we call our base/overriden version.
return base.call(this);
};
}(SubObj.prototype.index));
// Usage:
var o = new Obj(), so = new SubObj();
o.index(); // Returns 0
so.index(); // Returns 0
so.index(o); // Returns 10
您的prototype
链构造存在一些问题(SubObj.prototype.prototype = Obj
实际上没有做任何事情)以及index()
对象上SubObj.prototype
方法的定义(即使用this
作为参数 - 当您尝试在几乎任何浏览器中运行时,这可能会导致痛苦的世界)。我已经修复并实现了你所寻求的覆盖(至少我认为这是你所追求的)。如果我误解了任何事情,请告诉我。