Как переопределить часть функции перегрузки в JavaScript - PullRequest
1 голос
/ 19 марта 2012

Я создаю класс с такой функцией

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 (child), однако 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 (дочерний) должен быть как закрытым (не должен использоваться, кроме функции index ()), так и общедоступным (это функция перегрузки index (), которая является публичной)

У вас, ребята, есть идея получше?

1 Ответ

0 голосов
/ 21 мая 2012

Насколько я понимаю, то, что вы пытаетесь сделать, должно быть вполне выполнимым.Хотя я бы воспользовался советом Роба и отошел от попыток навязать классический дизайн 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 в качестве аргумента - это, вероятно, вызовет боль, когда вы попытаетесь запустить его практически в любом браузере).Я сделал исправления и реализовал переопределение, которое вы ищете (по крайней мере, я думаю, что это то, что вам нужно).Дайте мне знать, если я что-то неправильно понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...