说我想写一个插件,一个修改在不同模块中导出的对象的模块。如何修改原始对象的其中一种方法?这是我试图开始工作的代码。我觉得我在这里缺少一些基本的东西。
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!
答案 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
。这是因为allTheBest
中fun.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;
最后,您错误地呼叫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!