如何使用任意原型创建可调用的JS对象?

And*_*rov 15 javascript functional-programming

可能重复:
JavaScript对象可以有一个原型链,但也可以是一个函数?

我正在寻找一个可调用的JavaScript对象,具有任意原型链,但不修改Function.prototype.

换句话说,这必须工作:

var o = { x: 5 };
var foo = bar(o);
assert(foo() === "Hello World!");
delete foo.x;
assert(foo.x === 5);
Run Code Online (Sandbox Code Playgroud)

没有做任何全球变化.

oll*_*iej 12

没有什么可以阻止你向函数添加任意属性,例如.

function bar(o) {
    var f = function() { return "Hello World!"; }
    o.__proto__ = f.__proto__;
    f.__proto__ = o;
    return f;
}

var o = { x: 5 };
var foo = bar(o);
assert(foo() === "Hello World!");
delete foo.x;
assert(foo.x === 5);
Run Code Online (Sandbox Code Playgroud)

我相信应该做你想做的事.

这可以通过将对象o注入原型链来实现,但有几点需要注意:

  • 我不知道IE是否支持__proto__,甚至有一个等效的,一些评论,这看起来只适用于基于firefox和safari的浏览器(因此camino,chrome等工作).
  • o.__proto__ = f.__proto__;只是函数原型函数(如function.toString)才真正需要,所以你可能只想跳过它,特别是如果你希望o有一个有意义的原型.