Оценить метод подкласса внутри области базового класса в JavaScript - PullRequest
1 голос
/ 23 июня 2011
base = function () {
  this.A = function () {
    this.B();
  }
  var C = function () {
    alert('I am C');
  }
}

sub = function () {
  this.B = function () {
    C();
  }
}

sub.prototype = new base();

(new sub()).A();

Как я могу сказать вызову B() для оценки относительно базового класса? (то есть вызов c базового класса) Это невозможно?

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Обычно я бы порекомендовал myFunc.apply и myFunc.eval; это то, что я интерпретирую как «относительно базового класса» в javascript.

Однако, исходя из вашего названия, вы говорите «внутри области действия базового класса»; если я правильно предполагаю, что вы говорите о замыканиях и можете ссылаться на переменные во внешних функциях, это невозможно, за исключением, возможно, сохранения точки входа в замыкании, в которую вы можете передавать запросы в стиле eval ... но если вы сделать это, вы могли бы также иметь объект, как this._private.C.

Если вы пытаетесь сохранить конфиденциальность, не стоит беспокоиться об этом в javascript.

Если вы укажете мотивацию для this.C = function(){...} и обозначите ее как this.C(), я смогу дать более четкий ответ.

" Это позволило бы вызывать C на экземплярах / по существу раскрывать его. Нет причин для его показа, поскольку он должен быть вспомогательным методом. Думаю, вы могли бы сказать, что мое основное разочарование заключается в том, что вспомогательные методы не может наследоваться подклассами."--OP

В таком случае, это действительно не личное. Однако, что вы можете сделать, это определить свой вспомогательный метод, где он принадлежит: соответственно во внешней области видимости. =) Например:

(function(){

  var C = function () {
    alert('I am C');
  }

  base = function () {
    this.A = function () {
      this.B();
    }
  }

  sub = function () {
    this.B = function () {
      C();
    }
  }

})();

sub.prototype = new base();

(new sub()).A();
1 голос
/ 23 июня 2011

Вы не можете, по крайней мере, без изменения базового класса.

C имеет лексическую область в пределах base, поэтому отображается только при вызове другими методами, определенными в той же области . В настоящее время это действительно приватный метод.

C доступен только за пределами лексической области видимости, если он объявлен как this.C вместо var C.

См. http://jsfiddle.net/alnitak/DaSEN/

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