创建Function.prototype.theSame,以便f()可以作为f.theSame()调用

时间:2016-02-11 17:29:59

标签: javascript

我想为每个函数创建一个别名,而不是调用:

f();

我可以打电话:

f.theSame();

......并且具有相同的效果。 没有理由,只是好奇心。

使用Function.prototype这看起来很简单:

Function.prototype.theSame = function() {
    return this(arguments);
};

var foo = function foo() {return 1;};

console.log(foo.theSame()); // prints 1 - OK

当我意识到上述内容对“成员函数”不起作用时会出现问题,因为隐藏了this

var a = {x: 3, f: function() {return this.x;}};

console.log(a.f()); // prints 3 - OK

// throws TypeError: object is not a function
console.log(a.f.theSame.apply(a, []));

console.log(a.f.theSame()); // prints undefined

所以必须做一些事情:

Function.prototype.theSame2 = function() {
    var fn = this;
    return function() {
        return fn.apply(this, arguments);
    };
};

然而,这需要()()笨拙的构造:

console.log(a.f.theSame2()()); // prints 3 - OK

有没有办法实现theSame,使其适用于“成员函数”而不使用()()结构?

1 个答案:

答案 0 :(得分:3)

没有。如果您使用a.f.theSame()调用该函数,那么您将f称为其自身的属性(即this指的是函数本身)。没有"连接"从函数到包含对象,因为函数只是一个值,可以是许多对象的属性。

为了使您的示例正常工作,您必须执行一个将函数绑定到a的额外初始化步骤,例如

a.f = a.f.bind(a);

没有办法解决这个问题。