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)
(也称为调用
)