修改来自不同模块的原型函数

Modify a prototype function from a different module

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

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!
var oldAllTheBest = Fun.prototype.allTheBest;
Fun.allTheBest = function (n) {

您需要覆盖

Fun.prototype.allTheBest = function(n) {

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

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

其次,当您尝试在 var oldAllTheBest = Fun.prototype.allTheBest; 中获取 allTheBest 的旧定义时,您将得到 undefined。那是因为 fun.jsallTheBest 的定义只会在您通过 new 实例化 Fun 对象时创建。您应该通过 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;

最后,您调用 apply 不正确。 apply 采用参数数组。

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

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!