【问题标题】:Define a function with a prototype chain使用原型链定义函数
【发布时间】:2012-06-12 19:05:56
【问题描述】:

假设我有一个对象X 定义为

var X = function () {};
X.prototype.doSomething = function () {};
X.prototype.doSomethingElse = function () {};

是否可以构造一个函数 f 以便f instanceof X? 请注意,我还必须能够在没有TypeError 的情况下执行f()


在 Mozilla 中,我可以用 __proto__ 做我想做的事:

var f = function () {};
f.__proto__ = new X;

但是,即 (1) 非标准和 (2) 已弃用。 MDN's page for __proto__ 建议改用Object.getPrototypeOf,但我真正要找的是Object.setPrototypeOf(它不存在,尽管this bug report 提出了这个想法)。

我想要的便宜的近似值是

var f = function () {};
jQuery.extend(f, new X);

不幸的是,这不会使 f instanceof X 为真(我也不会 期待它!)。

【问题讨论】:

  • 我相信您正在寻找的是通常称为“可调用对象”的东西。如果您正在寻找该术语,您可能需要在 StackOverflow 上进行快速搜索。不确定您是否会找到像__proto__ 提供的那样简单的解决方案。
  • 我会选择“为什么?”和“可能不会。”在这个上。
  • @RyanKinal:我链接的错误报告中显示了一个用例。

标签: javascript


【解决方案1】:

不,这是不可能的(以标准方式)。创建可调用对象(即函数)的每一种可能性都将创建一个继承自 Function.prototype1 的对象;并且之后您无法更改对象的[[prototype]]2

另见:

1:好的,ES6 允许我们subclass Function。但这并不像听起来那么有用。
2:从ES6开始,可以使用Object.setPrototypeOf

【讨论】:

  • 你为什么想要那个?而且你仍然可以扩展 Function.prototype。
  • 虽然我个人没有用例(我只是好奇 JavaScript 是否可以做到这一点),但我在问题中链接的错误报告中有一个用例。
猜你喜欢
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多