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

Javascript 创建Function.prototype.theSame,以便f()可以作为f.theSame()调用,javascript,Javascript,我想为每个函数创建一个别名,以便代替调用: f(); 我可以打电话: f.theSame(); 。。。也有同样的效果。 没有理由,只是好奇 通过使用Function.prototype这似乎很容易: Function.prototype.theSame = function() { return this(arguments); }; var foo = function foo() {return 1;}; console.log(foo.theSame()); // prin

我想为每个函数创建一个别名,以便代替调用:

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
,使其在不使用
()
构造的情况下适用于“成员函数”?

否。如果使用
a.f.theSame()
调用函数,则调用
f
作为函数本身的属性(即
指函数本身)。函数与包含对象之间没有“连接”,因为函数只是一个值,可能是许多对象的属性

为了使示例有效,您必须执行附加的初始化步骤,将函数与
a
,例如

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

没有办法解决这个问题。

没有。如果您使用
a.f.theSame()
调用函数,那么您将调用
f
作为函数本身的属性(即
引用函数本身)。函数与包含对象之间没有“连接”,因为函数只是一个值,可能是许多对象的属性

为了使示例有效,您必须执行附加的初始化步骤,将函数与
a
,例如

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

这是没有办法的。

a.f.same2()()
实际上不起作用。它将打印全局
x
变量,而不是
a.x
。在传递参数时,第一个示例无法按预期工作。您应该有
this.apply(null,arguments)
,其中
null
是您希望调用的默认thisArg。如果将
a.f
作为第一个参数传递给
,则失败的第二个示例将只起作用(而不是抛出)。否则,您试图使
中的
这个
表示两个不同的事物。所以任何依赖于
这个
的函数都是行不通的。@Bergi我想你弄错了,没有全局
x
变量,我通过修改
a
对象中的属性
x
对其进行了测试-它确实报告了
a.x
@MarcusJuniusBrutus:我无法复制。它只记录未定义的
而不是
3
。你能设置一个演示吗?
a.f.theSame2()()
实际上不起作用。它将打印全局
x
变量,而不是
a.x
。在传递参数时,第一个示例无法按预期工作。您应该有
this.apply(null,arguments)
,其中
null
是您希望调用的默认thisArg。如果将
a.f
作为第一个参数传递给
,则失败的第二个示例将只起作用(而不是抛出)。否则,您试图使
中的
这个
表示两个不同的事物。所以任何依赖于
这个
的函数都是行不通的。@Bergi我想你弄错了,没有全局
x
变量,我通过修改
a
对象中的属性
x
对其进行了测试-它确实报告了
a.x
@MarcusJuniusBrutus:我无法复制。它只记录未定义的
而不是
3
。您可以设置演示吗?…或者使用
a.f.theSame(a)
(也称为
a.f.theSame(a)
)…或者使用
a.f.theSame(a)
(也称为
调用