从不同的模块修改原型函数

时间:2015-03-19 17:44:13

标签: javascript node.js requirejs commonjs

说我想写一个插件,一个修改在不同模块中导出的对象的模块。如何修改原始对象的其中一种方法?这是我试图开始工作的代码。我觉得我在这里缺少一些基本的东西。

server.js

var Fun = require('./fun2');

var fun = new Fun('honey');
console.log(fun.allTheBest(3));
fun.hiccup();

fun.js

var Fun = function(b) {
    this.best = b;

    this.allTheBest = function(n) {
        var theBest = '';
        for (var i = 0; i < n; i++) {
            theBest += this.best + ' ';
        }
        return theBest;
    };
};

module.exports = Fun;

fun2.js

var Fun = require('./fun');

var oldAllTheBest = Fun.prototype.allTheBest;

Fun.allTheBest = function (n) {
    console.log("I'm starting allTheBest.");
    return oldAllTheBest.apply(this, n);
};

Fun.prototype.hiccup = function() {
    console.log('Hic!');
};

module.exports = Fun;

这是我得到的输出:

honey honey honey 
Hic!

但我期待这个:

I'm starting allTheBest.
honey honey honey
Hic!

2 个答案:

答案 0 :(得分:2)

var oldAllTheBest = Fun.prototype.allTheBest;
Fun.allTheBest = function (n) {

你想要覆盖

Fun.prototype.allTheBest = function(n) {

答案 1 :(得分:2)

您的代码中存在三个问题。首先,正如Bergi所指出的,你应该像这样覆盖原型函数:

Fun.prototype.allTheBest = function(n) { /* ... */ }

其次,当您尝试在allTheBest中获得var oldAllTheBest = Fun.prototype.allTheBest;的旧定义时,您将获得undefined。这是因为allTheBestfun.js的定义只会在您通过Fun实例化new对象时创建。您应该通过prototype来定义函数:

<强> fun.js

var Fun = function(b) {
    this.best = b;
}

Fun.prototype.allTheBest = function(n) {
        var theBest = '';
        for (var i = 0; i < n; i++) {
            theBest += this.best + ' ';
        }
        return theBest;
};

module.exports = Fun;

最后,您错误地呼叫applyapply采用一系列参数。

因此,您要么将代码更改为:

return oldAllTheBest.apply(this, [n]);

或者这个:

return oldAllTheBest.call(this, n);

通过这些更改,您的脚本将具有所需的输出:

victor@ubuntu:~/Documents/a$ node app.js 
I'm starting allTheBest.
honey honey honey 
Hic!