修改来自不同模块的原型函数
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.js
中 allTheBest
的定义只会在您通过 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!
说我想写一个插件,一个修改在不同模块中导出的对象的模块。如何修改原始对象的其中一个方法?这是我要开始工作的代码。我觉得我在这里缺少一些基本的东西。
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.js
中 allTheBest
的定义只会在您通过 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!