0

为了在 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 所在的地方,我尝试了几件事,但没有任何效果。它应该调用被覆盖的超类的方法。

非常感谢您的帮助

4

2 回答 2

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 中完成经典继承。

于 2013-03-06T00:38:56.213 回答
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);” 在 superinit 调用之后。

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

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

于 2013-03-06T10:43:06.960 回答