gpt4 book ai didi

javascript - 将javascript函数重写到node.js模块中

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:50 26 4
gpt4 key购买 nike

我有这个函数:(我猜这是用于创建 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() {}
});

但是不行,你能帮我重写一下吗?

更新:我根据@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;

但是这是未定义的。那么问题在哪里呢?

最终我为nodejs使用了mochiscript模块,它是更好的语法糖,具有更多面向对象的功能。

最佳答案

在您的代码中,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 或其他任何内容。

关于javascript - 将javascript函数重写到node.js模块中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24356220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com