在javascript中计算基类范围内的子类方法

在javascript中计算基类范围内的子类方法,javascript,oop,class,inheritance,Javascript,Oop,Class,Inheritance,我如何告诉调用B()对基类求值?(即调用基类的c)这是不可能的吗?通常我建议myFunc.apply和myFunc.eval;这就是我在javascript中解释为“关于基类”的内容 然而,基于您的标题,您说“在基类范围内”;如果我正确地假设您谈论的是闭包,并且能够引用外部函数中的变量,那么这是不可能的,除非在闭包中保留一个入口点,您可以将请求eval样式传递到其中。。。但是如果你这样做,你可能会有一个像这样的对象。_private.C 如果您试图将事情保持“私有”,那么在javascript中

我如何告诉调用
B()
对基类求值?(即调用基类的c)这是不可能的吗?

通常我建议
myFunc.apply
myFunc.eval
;这就是我在javascript中解释为“关于基类”的内容

然而,基于您的标题,您说“在基类范围内”;如果我正确地假设您谈论的是闭包,并且能够引用外部函数中的变量,那么这是不可能的,除非在闭包中保留一个入口点,您可以将请求eval样式传递到其中。。。但是如果你这样做,你可能会有一个像
这样的对象。_private.C

如果您试图将事情保持“私有”,那么在javascript中这样做就不值得费心了

如果你说出你对
this.C=function()


“这将允许在实例上调用C/本质上公开它。没有理由公开它,因为它应该是一个helper方法。我想你可以说我的主要挫折是helper方法不能被子类继承。”--OP

在这种情况下,它真的不是私人的。但是,您可以做的是在其所属的位置定义助手方法:适当地在外部作用域中。=)例如:

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();

你不能,至少不能不改变基类

C
base
中有词法作用域,因此只有在同一作用域中定义的其他方法调用时才可见。它目前是一种真正私有的方法

C
只有在声明为
this.C
而不是
var C
时才能在其词法范围之外访问


请参见

是,调用并应用是调用原型对象的method@ninjagecko先生,你是个天才(或许我还是个javascript新手)。那个外部作用域正是我想要的。@Jiawhili:没问题,我还是不建议过分强调在javascript中隐藏内部。与此相关的是,尽管你看起来并不是一个新手,但你也应该意识到最常见的javascript陷阱:如果你使用
.map
$进行任何类型的迭代。每个
for
循环,通常需要编写匿名函数,因为每个函数只创建一个具有单一名称的变量。如果在循环中定义回调,通常会注意到这一点。@ninjagecko是的,JavaScript garden教会了我这一点(我从中学到了这一点):)在考虑了一段时间后,我确实对您的解决方案有一些小的疑问。当C被放置在两个类之外时,它将不再能够访问它们内部的私有变量(因此破坏了它作为“助手”函数的能力)。@Jiaweili:我认为,这可能是
C.call(这个,arg1,arg2,…)
的一个用例?这将允许
C
访问
这个东西--或者——您也可以只声明
var C
当前所在的位置,然后在
base
的范围内定义
C=function(){…}
!这可能不会满足您的需要。是否有特殊原因使您不希望执行
This.C=function(){…}
并将其称为
This.C()
?这将允许在实例上调用C/本质上公开它。没有理由公开它,因为它应该是一个助手方法。我想你可能会说,我的主要挫折是助手方法不能被子类继承。我在计算A()时可以访问C(),这似乎有些讽刺,因为我在基类的范围内,但在调用此.B()时,它会沿着原型链向下移动,我不能再访问它了。@加维里就是它的工作原理——想想 C++ <代码>,就像java或C++中的私有方法一样,你也会遇到同样的问题。
(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();