我想为每个函数创建一个别名,而不是调用:
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
,使其适用于“成员函数”而不使用()()
结构?
答案 0 :(得分:3)
没有。如果您使用a.f.theSame()
调用该函数,那么您将f
称为其自身的属性(即this
指的是函数本身)。没有"连接"从函数到包含对象,因为函数只是一个值,可以是许多对象的属性。
为了使您的示例正常工作,您必须执行一个将函数绑定到a
的额外初始化步骤,例如
a.f = a.f.bind(a);
没有办法解决这个问题。