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

时间:2013-03-05 21:41:02

标签: javascript

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

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

例如:

myApp.createClass("myapp.core.JString", "myapp.core.BaseString", {
  abc: function () {
  ...

首先我创建一个构造函数

Cf = function () {
...

如果有超类(“Base”是超类的构造函数):

protoObj = new Base();
protoObj.constructor = Cf;

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

for (name in protos) {
  ????????????????????
  protoObj[name] = protos[name]

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

init: function () {
  this.jstring_super_init();
...

所以,问号在哪里,我想放置以下代码: (在这种情况下classnameLast是“jstring”=>类路径的最后一部分=>小写)

if ((typeof protos[name] === "function") && 
    (protoObj[name]) && 
    (typeof protoObj[name] === "function")) {
  supername = classnameLast + "_super_" + name;
  protoObj[supername] = XXXXXXXXXXXXX

在多个X所在的地方,我尝试了几件事,但没有任何效果。它应该调用覆盖的超类的方法。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

也许你可以这样做:

for (name in protos) {
    var super_function = ...; //wherever it comes from
    protoObj[name] = protos[name];
    protos[name]._super = super_function;
}

然后,从函数中,您应该可以通过this._super访问超级函数。您甚至可以执行this._super.call(this, ...)以确保在this的上下文中调用超级函数。

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

http://pastebin.com/Z2kaXqEv

编辑:帮助我使用Typescript游乐场(http://www.typescriptlang.org/Playground/)的原因。玩它和它的类功能,看看它如何编译为Javascript。这将帮助您更好地理解如何在Javascript中完成经典继承。

答案 1 :(得分:0)

我为XXXXXXXXXXXX尝试了这个,它起作用了:

(function(name1, Base1){
  return function() {
    Base1.prototype[name1].apply(this, arguments);                                                                       
  };
})(name, Base);

我在Firefox 19,Firebug 1.11.2中调试了一个“jstring_super_init”函数调用。

Firebug表现得非常奇怪,跳到错误的代码位置!!

然后,我插入了“console.log(this.cid);”在超级电话之后。

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

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