【问题标题】:Evaluate subclass method inside base class scope in javascript在javascript中评估基类范围内的子类方法
【发布时间】:2011-06-23 12:37:27
【问题描述】:
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)这不可能吗?

【问题讨论】:

  • 有什么特别的原因你不想做this.C = function(){...} 并称之为this.C()
  • 这将允许在实例上调用 C / 实质上公开它。没有理由暴露它,因为它应该是一个辅助方法。我想你可以说我的主要挫折是辅助方法不能被子类继承。

标签: javascript oop class inheritance


【解决方案1】:

通常我会推荐myFunc.applymyFunc.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();

【讨论】:

  • 是的,调用和应用是调用原型对象方法的关键
  • @ninjagecko 先生,你是个天才(或者我可能还是个 JavaScript 新手)。那个外部瞄准镜正是我想要的。
  • @jiaweihli:没问题,我仍然不建议过分强调在 javascript 中隐藏内部结构。有点相关的是,虽然您似乎根本不是新手,但您也应该知道最常见的 javascript 陷阱:如果您使用 .map$.eachfor 循环进行任何类型的迭代,您通常需要编写匿名函数,因为每个函数只创建一个具有单一名称的变量。如果在循环中定义回调,通常会注意到这一点。
  • @ninjagecko 是的,JavaScript Garden 教会了我这一点(而且我学到了很多东西):) 在考虑了一段时间后,我确实对你的解决方案有一点小问题。当 C 被放置在两个类之外时,它不再能够访问它们中的私有变量(因此破坏了它成为“帮助”函数的能力)。
  • @jiaweihli:我认为这可能是C.call(this, arg1,arg2,...) 的一个用例?这将允许C 访问this.something。 --或者-- 你也可以只声明var C,然后在base的范围内定义C = function(){...}!不过,这可能不会做你想要的。
【解决方案2】:

你不能,至少在不改变基类的情况下不能。

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

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

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

【讨论】:

  • 对我来说有点讽刺的是,我可以在评估 A() 时访问 C(),因为我在基类的范围内,但是因为在调用它时它会沿着原型链返回。 B(),我不能再访问它了。
  • @jiaweihli 这就是它的工作原理 - 将 C 视为 Java 或 C++ 中的私有方法,您也会遇到同样的问题。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2022-08-02
  • 1970-01-01
相关资源
最近更新 更多