Javascript 使用原型链定义函数

Javascript 使用原型链定义函数,javascript,Javascript,假设我有一个对象X定义为 var X = function () {}; X.prototype.doSomething = function () {}; X.prototype.doSomethingElse = function () {}; 是否可以构造一个函数f,以使X的f实例? 请注意,我还必须能够在没有类型错误的情况下执行f() 在Mozilla中,我可以使用\uuuuu proto\uuuu做我想做的事情: var f = function () {}; f.__proto_

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

var X = function () {};
X.prototype.doSomething = function () {};
X.prototype.doSomethingElse = function () {};
是否可以构造一个函数
f
,以使X的
f实例
? 请注意,我还必须能够在没有类型错误的情况下执行
f()


在Mozilla中,我可以使用
\uuuuu proto\uuuu
做我想做的事情:

var f = function () {};
f.__proto__ = new X;
然而,这是(1)非标准和(2)不推荐的。建议改为使用
对象.getPrototypeOf
,但我真正想要的是
对象.setPrototypeOf
(虽然在中提出了这个想法,但它并不存在)

我想要的便宜的近似值是

var f = function () {};
jQuery.extend(f, new X);
不幸的是,这并不能使X的
f instanceof X
为真(我也不会) 希望如此!)。

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

另见:

  • (对于某些内部构件)
1:好的,ES6允许我们。但这并不像听起来那么有用。

2:从ES6开始,您可以使用。

我相信您正在寻找的是通常称为“可调用对象”的对象。如果您要查找的是StackOverflow,您可能需要快速搜索该术语。我不确定你是否能找到像
\uuuu proto\uuuu>提供的那样简单的解决方案。我会选择“为什么?”和“可能不会”。在这个问题上。@RyanKinal:我链接的bug报告中显示了一个用例。你为什么要这样做?您仍然可以扩展Function.prototype。虽然我个人没有用例(我只是好奇JavaScript是否可以这样做),但我在问题中链接的bug报告中有一个用例。