我有这个功能:(我想用于创建javascript对象的抽象工厂)
var $class = function(definition) {
var constructor = definition.constructor;
var parent = definition.Extends;
if (parent) {
var F = function() { };
constructor._superClass = F.prototype = parent.prototype;
constructor.prototype = new F();
}
for (var key in definition) {
constructor.prototype[key] = definition[key];
}
constructor.prototype.constructor = constructor;
return constructor;
};
用它来定义类C / java语法,比如使用多态和扩展:
var Bullet = $class({
Extends: GameObject,
constructor: function(texturePath, x, y, ctx, direction, passable, player) {
GameObject.call(this, texturePath, x, y, ctx, 1, 1, passable, new Array(8, 8, 0, 0));
},
isActive: function() {
},
getPlayer: function() {
},
update: function(dt) {
},
destroy: function() {
},
processCollision: function() {
}
});
然后致电:
var bullet = new Bullet(params);
我尝试将其重写为nodejs模块,如下所示:
(function(){
var $class = function(definition) {
var constructor = definition.constructor;
var parent = definition.Extends;
if (parent) {
var F = function() { };
constructor._superClass = F.prototype = parent.prototype;
constructor.prototype = new F();
}
for (var key in definition) {
constructor.prototype[key] = definition[key];
}
constructor.prototype.constructor = constructor;
return constructor;
};
module.exports.createClass = function() {
return $class();
}
});
然后用:
来调用它var c = require(__dirname + "\\Class");
var Bullet = c.createClass({
Extends: GameObject,
constructor: function() {}
});
但它不起作用,请你帮我重写一次?
UPDATE :我从@Salem回复中重写了它,但是我在进程中失去了扩展和多态性。 为了扩展我只需要写而不是
Extends: ParentClass
这样:
Extends: ParentClass.constructor
我预计多态会是这样的:
// in class which is extended from ParentClass
ParentClass.method();
// in parent class adding line
module.exports.method = ParentClass.method;
但这是未定义的。那捕获的地方在哪里?
最终我将mochiscript模块用于nodejs,它甚至是更好的语法糖,具有更多面向对象的功能。
答案 0 :(得分:0)
在您的代码中,createClass
是一个没有任何参数的函数。您也可以在没有任何参数的情况下致电$class
。
您不需要将所有代码包装在函数中,因为除非您导出它,否则您在此处声明的所有内容都无法从外部访问。所以它应该是这样的:
var func = function(definition) {
var constructor = definition.constructor;
var parent = definition.Extends;
if (parent) {
var F = function() { };
constructor._superClass = F.prototype = parent.prototype;
constructor.prototype = new F();
}
for (var key in definition) {
constructor.prototype[key] = definition[key];
}
constructor.prototype.constructor = constructor;
return constructor;
};
module.exports.createClass = func;
这意味着,如果您需要此模块为X
,则您唯一可以访问的是X.createClass
,而不是X.func
或其他任何内容。