使用原型链定义函数

Define a function with a prototype chain

本文关键字:定义 函数 原型      更新时间:2023-09-26

假设我有一个对象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 的__proto__页面建议改用Object.getPrototypeOf,但我真正想要的是一个Object.setPrototypeOf(它不存在,尽管这个想法在这个错误报告中被提出)。

我想要的便宜近似是

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

不幸的是,这并不能使f instanceof X正确(我也不会期待它!

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

另请参阅:

  • 使用自定义原型在 JavaScript 中创建函数
  • 你能用JavaScript中的自定义原型创建函数吗?
  • 是否可以使用Function.prototype以外的其他原型创建函数?
  • JavaScript 对象可以有一个原型链,也可以是一个函数吗?
  • 函数的自定义原型链
  • 函数的正确原型链(对于某些内部)

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