在node.js中覆盖方法

时间:2014-07-16 16:41:58

标签: javascript node.js override

我正在寻找覆盖自定义模块node.js中方法的最佳方法。

我正在开发一个自定义中间件,它将帮助我自动加载一些自定义模块。像安全,用户等...

但我希望能够覆盖一些方法,如果我需要像自定义安全手检查。 目前我找到的唯一方法是导出一个将替换我的方法并公开上下文变量的函数。

// CUSTOM MODULE EXAMPLE
// ========================================

var myVar = "Hello ";
var myVar2 = "!";

var method = function() {
  return "world" + myVar2;
}

module.exports.loadModule = function() {
   console.log(myVar + method());
};

module.exports.overrideMethod = function(customMethod) {
  method = customMethod;
};

module.exports.myVar2 = myVar2;

我的主要应用就是这样:

// MAIN APP EXAMPLE
// ========================================

var myCustomModule = require('customModule.js');

myCustomModule.overrideMethod(function() {
   return "viewer" + myCustomModule.myVar2;
});

myCustomModule.loadModule(); 
你怎么看?我的方式好吗?

感谢阅读。 汤姆

1 个答案:

答案 0 :(得分:1)

通常我认为任何具有可变全局状态的模块都是错误的。相反,我选择使用这些方法创建一个对象,并有办法传递覆盖。

// CUSTOM MODULE EXAMPLE
// ========================================

var DEFAULT_PREFIX = "Hello ";
var DEFAULT_SUFFIX = "!";


var DEFAULT_METHOD = function() {
  return "world" + DEFAULT_SUFFIX;
};

module.exports = function(options){
    var method = options.method || DEFAULT_METHOD

    return {
        loadModule: function(){
            console.log(myVar + method());
        }
    };
};

module.exports.DEFAULT_SUFFIX = DEFAULT_SUFFIX;

然后你就可以这样使用:

// MAIN APP EXAMPLE
// ========================================

var myCustomModule = require('customModule.js');

var loader = myCustomModule({
    method: function() {
        return "viewer" + myCustomModule.DEFAULT_SUFFIX;
    }
});

loader.loadModule();