【问题标题】:Modify a prototype function from a different module从不同的模块修改原型函数
【发布时间】:2015-03-19 17:44:13
【问题描述】:

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

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!

【问题讨论】:

    标签: javascript node.js requirejs commonjs


    【解决方案1】:

    您的代码存在三个问题。首先,正如 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;
    

    最后,您错误地调用了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!
    

    【讨论】:

    • 就是这样!谢谢。
    【解决方案2】:
    var oldAllTheBest = Fun.prototype.allTheBest;
    Fun.allTheBest = function (n) {
    

    你会想要覆盖

    Fun.prototype.allTheBest = function(n) {
    

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2012-04-26
      相关资源
      最近更新 更多