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