Possible Duplicate:
Can a JavaScript object have a prototype chain, but also be a function?
我正在寻找一个可调用的 JavaScript 对象,具有任意原型(prototype)链,但不修改 Function.prototype。
换句话说,这必须有效:
var o = { x: 5 };
var foo = bar(o);
assert(foo() === "Hello World!");
delete foo.x;
assert(foo.x === 5);
不进行任何全局更改。
没有什么可以阻止您向函数添加任意属性,例如。
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);
我相信那应该做你想做的事。
这通过将对象 o
注入(inject)原型(prototype)链来实现,但是有几点需要注意:
- 我不知道 IE 是否支持
__proto__
,或者甚至有一个等效项,根据一些评论,这看起来只适用于基于 firefox 和 safari 的浏览器(因此 camino、chrome 等也适用).
o.__proto__ = f.__proto__;
仅对 function.toString 等函数原型(prototype)函数真正必要,因此您可能只想跳过它,特别是如果您期望 o
有一个有意义的原型(prototype)。