如何在JavaScript中覆盖部分重载函数

时间:2012-03-19 10:02:02

标签: javascript oop

我用类似这样的函数创建一个类

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()的重载函数,这是公共的)

你们有更好的主意吗?

1 个答案:

答案 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作为参数 - 当您尝试在几乎任何浏览器中运行时,这可能会导致痛苦的世界)。我已经修复并实现了你所寻求的覆盖(至少我认为这是你所追求的)。如果我误解了任何事情,请告诉我。