javascript - 如何使用任意原型(prototype)制作可调用的 JS 对象?

标签 javascript functional-programming

<分区>

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)。

关于javascript - 如何使用任意原型(prototype)制作可调用的 JS 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/548487/

相关文章:

javascript - 我的 javascript 代码中的字符串比较有什么问题?

javascript - 使用 ng-blur 进行输入验证(如果输入错误则更改背景颜色)

design-patterns - 如何构建用函数式语言编写的应用程序?

Java供应商可以优化对象实例化过程吗?

javascript - 位置固定相关父容器

javascript - show.bs.modal 中的附加元素未在 Bootstrap Modal 中被 .html 覆盖

javascript - useEffect 在 react v18 中被调用两次

function - Clojure:如何执行一系列函数?

scala - 正确使用术语 Monoid

algorithm - 来自 "Programming Pearls"的方程式 - 有人可以解释一下吗?