Object.create(Function.prototype) => 创建一个继承属性的函数对象

3
我希望您能构建一个具有继承功能的函数。这个函数是一个对象,可以在程序中实例化,但是它的原型上有新属性附加。此处提供了相关参考资料。
因此,我们不应该这样做:
Function.prototype.x = function(){

};

Function.prototype.y = function(){

};

所以我想要做的是类似于:

const proto = Object.create(Function.prototype);

proto.x = function(){};

proto.y = function(){};

然而,在程序的某个后续阶段,我希望能够实际定义proto函数体,以便我可以像调用函数一样调用proto:

proto();

有没有方法可以做到这一点?上述方法肯定不可行 :)

这个方法更接近了,错误信息也提示了:

function F(){

}

F.prototype = Function.prototype;

var f = new F();

f.apply(null);

运行上述代码,我们得到以下结果:

类型错误:Function.prototype.apply被调用在[object Object]上, 它是一个对象而不是函数 在Object. (/Users/amills/WebstormProjects/oresoftware/suman/exp7.js:15:3) 在Module._compile (module.js:541:32) 在Object.Module._extensions..js (module.js:550:10) 在Module.load (module.js:458:32) 在tryModuleLoad (module.js:417:12) 在Function.Module._load (module.js:409:3) 在Function.Module.runMain (module.js:575:10) 在startup (node.js:160:18) 在node.js:449:3


我已经尝试过这个,你越往下走,它就变得越不专业。你想通过这样做达到什么目的?为什么实例必须是一个函数?为什么不能简单地将函数附加到实例上? - Thomas
我相信你,尽管我所做的实验很少 - 我正在创建一个库/API。继承只意味着更高的性能,因为原型是共享对象 - 我想要的是一个既是函数又具有共享原型的对象,但不是函数的原型 :) 可能不会发生 :( - Alexander Mills
在兼容的引擎中,您可以定义一个“扩展函数”的class支持)。 - Jonathan Lonowski
1
@AlexMills 函数是通过内部属性[[Call]]来识别的。这个属性不是从原型继承而来的,Object.create()也没有任何机制来定义它。 - class通过通过super()调用Function构造函数来工作,这确实设置了[[Call]] - Jonathan Lonowski
1
一个可能的替代方案是在创建函数之后更改该函数的原型 - var foo = function() {}; Object.setPrototypeOf(foo, proto); - Jonathan Lonowski
显示剩余8条评论
1个回答

1

正确的做法如下!

步骤1

创建一个从 Function.prototype 继承的 Object

const obj = Object.create(Function.prototype);  // inherits many properties, etc

步骤2

在程序中稍后声明该函数

const f = function(){};

步骤3

f__proto__设置为obj

Object.setPrototypeOf(f,obj);基本上等同于f.__proto__ = obj;

这种方式似乎没有任何问题,感谢大家的帮助!


1
注意:这个方法可以工作,但是你将无法调用f.apply()、f.call()或f.toString(),所以这可能会成为一个问题。 - Alexander Mills
3
请只介绍Object.setPrototypeOf,不要提到已弃用的__proto__ :-) - Bergi
2
@AlexMills 然后让 obj 继承自 Function.prototype - Oriol
@Oriol 谢谢,我尝试了一下,完美地解决了问题,你真是个好人。 - Alexander Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接