Javascript,从覆盖方法调用超类方法的方便方法

Javascript,从覆盖方法调用超类方法的方便方法,javascript,Javascript,为了在JavaScript中模拟经典的、类似Java的类,我有一个名为 “createClass”: 它有3个参数: *应创建的构造函数的名称和路径。 *超类的路径。 *具有类的方法的JavaScript对象 例如: myApp.createClass("myapp.core.JString", "myapp.core.BaseString", { abc: function () { ... 首先,我创建一个构造函数 Cf = function () { ... 如果存在一个超类(

为了在JavaScript中模拟经典的、类似Java的类,我有一个名为 “createClass”:

它有3个参数:
*应创建的构造函数的名称和路径。
*超类的路径。
*具有类的方法的JavaScript对象

例如:

myApp.createClass("myapp.core.JString", "myapp.core.BaseString", {
  abc: function () {
  ...
首先,我创建一个构造函数

Cf = function () {
...
如果存在一个超类(“Base”是该超类的构造函数):

现在,通过新类的方法,我将它们放到protoObj:
(“protos”是带有“class”方法的对象)

但是在将这些方法放到protoObj之前,我想为 从覆盖的方法调用超类方法:

init: function () {
  this.jstring_super_init();
...
因此,在问号所在的位置,我想放置以下代码: (在本例中,classnameLast是“jstring”=>类路径的最后一部分=>小写)

在X的倍数所在的地方,我尝试了几种方法,但都没有效果。它应该调用被覆盖的超类的方法


非常感谢您的帮助

也许您可以这样做:

for (name in protos) {
    var super_function = ...; //wherever it comes from
    protoObj[name] = protos[name];
    protos[name]._super = super_function;
}
然后,从函数内部,您应该可以通过
this.\u super
访问超级函数。您甚至可以执行
this.\u super.call(this,…)
以确保在
this
的上下文中调用super函数

希望我对你的理解是正确的。另外,如果我能提出一个建议,可能有一个更简单的方法来处理经典对象和继承。如果您不想使用Typescript,至少可以尝试他们使用的继承模型(这是很常见的)


编辑:帮助我的是使用打字脚本()。使用它和它的类特性,看看它是如何编译成Javascript的。这将帮助您更好地理解如何在Javascript中实现经典继承。

我在XXXXXXXXXXXX中尝试了这一点,效果很好:

(function(name1, Base1){
  return function() {
    Base1.prototype[name1].apply(this, arguments);                                                                       
  };
})(name, Base);
我在Firefox19 Firebug 1.11.2中调试了一个“jstring_super_init”函数调用

Firebug的行为非常奇怪,跳到了错误的代码位置

然后,我在superinit调用之后插入了“console.log(this.cid);”

在超类的init方法中放置在“this”上的cid就在那里


当使用Google Chrome版本25进行调试时,它会跳转到正确的功能

超级方法应该用什么代码调用?
if ((typeof protos[name] === "function") && 
    (protoObj[name]) && 
    (typeof protoObj[name] === "function")) {
  supername = classnameLast + "_super_" + name;
  protoObj[supername] = XXXXXXXXXXXXX
for (name in protos) {
    var super_function = ...; //wherever it comes from
    protoObj[name] = protos[name];
    protos[name]._super = super_function;
}
(function(name1, Base1){
  return function() {
    Base1.prototype[name1].apply(this, arguments);                                                                       
  };
})(name, Base);