为了在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所在的地方,我尝试了几件事,但没有任何效果。它应该调用覆盖的超类的方法。
非常感谢您的帮助
答案 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,至少要尝试他们使用的继承模型(这很常见)。
编辑:帮助我使用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进行调试时,它会跳转到正确的功能!