没有什么可以阻止你向函数添加任意属性,例如.
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
注入原型链来实现,但有几点需要注意:
我不知道IE是否支持__proto__
,甚至有一个等效的,一些评论,这看起来只适用于基于firefox和safari的浏览器(因此camino,chrome等工作).
o.__proto__ = f.__proto__;
只是函数原型函数(如function.toString)才真正需要,所以你可能只想跳过它,特别是如果你希望o
有一个有意义的原型.