在javascript中评估基类范围内的子类方法

时间:2011-06-23 12:37:28

标签: javascript oop class inheritance

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 个答案:

答案 0 :(得分:2)

通常我会推荐myFunc.applymyFunc.eval;这就是我在javascript中解释为“关于基类”的内容。

但是根据你的标题,你说“在基类范围内”;如果我正确地假设您正在讨论闭包并且能够在外部函数中引用变量,那么这是不可能的,除非将入口点保留在闭包中,您可以在其中传入请求eval-style ...但是如果你要做到这一点,你可能会有一个像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 :(得分:1)

你不能,至少不能没有改变基类。

Cbase中具有词汇范围,因此只有在同一范围内定义的其他方法调用时才可见。它目前是一个真正的私有方法。

C只能在其词法范围之外访问,如果它被声明为this.C而不是var C

请参阅http://jsfiddle.net/alnitak/DaSEN/