在节点导出中覆盖函数的toString()

时间:2015-01-25 21:09:07

标签: javascript node.js

我试图覆盖toString()方法,但遇到了困难。 已经看过herehere,但仍然没有运气。

我的代码如下:

var Foo = function(arg) {
    // some code here...

    return function (a, b, c) {
       // return function code...
    };
};

Foo.prototype.toString = function () {
    return "string representation of function";
};

exports.bar(arg) {
    return Foo(arg);
};

在另一个模块中:

var mod = require('the-module-from-above');
console.log(mod.bar().toString()); // prints return function source code.

我的问题是,为什么我的toString()函数没有被调用,如何让它被调用?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您将该函数用作new的构造函数,则只能在函数的原型上设置内容。由于您似乎没有在此处执行此操作,因此您需要在返回的实际函数上设置toString函数。

function fooToString() {
    return "string representation of function";
}

var Foo = function(arg) {
    // some code here...

    var ret = function (a, b, c) {
       // return function code...
    };
    ret.toString = fooToString;
    return ret;
};

如果您愿意,可以在toString函数中实际创建对象时添加bar函数。

exports.bar(arg) {
    var foo = Foo(arg);
    foo.toString = fooToString;
    return foo;
};