簡體   English   中英

將javascript函數重寫為node.js模塊

[英]Rewrite javascript function into node.js module

我有這個功能:(我猜這是用於創建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;

但這是不確定的。 那么漁獲量在哪里?

最后,我用mochiscript模塊的NodeJS,那就更好了語法糖有更多的面向對象的功能。

在您的代碼中, 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或其他任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM