在这一点上,对我当前的项目或任何其他东西都没有需求。只是想了解这些事情是如何工作的。
在我的“家庭项目”中,我避免使用ES6而不是ES5方法。到目前为止,对于继承,我使用大多数教育文章提供的简单原型继承示例:
function SomeConstructor() {...}
function SomeExConstructor() {...}
SomeExConstructor.prototype = Object.create(SomeConstructor.prototype);
SomeExConstructor.prototype.constructor = SomeExConstructor;
这很好而且很简单,而且很重要,它可以工作。
但是有一天我问自己一个问题:“我可以扩展Function构造函数吗?保留将实例作为普通函数调用的功能。”
我上面描述的简单方法似乎并不以这种方式工作。
function A() { this.asd = 2; }
A.prototype = Object.create(Function.prototype);
A.prototype.constructor = A;
var a = new A('return "Hello!";');
a();
> Uncaught TypeError: a is not a function
起初我以为可以,并且不能扩展功能。但是尝试使用现代的OOP方法(据我所知,这只是原型继承的语法糖):
class B extends Function { asd = 2; };
var b = new B('return "Hello!"');
b();
> "Hello!"
成功了!我试图在互联网上搜索答案,使用的是“ Object.setPrototypeOf”-不走运。
试图在babeljs.io上了解其如何转换class A extends Function {};
,并且输出中有一种地狱般的语言。
我的一位同事建议从扩展的构造函数中返回新的函数实例,但这并不对。
有没有办法仅通过ES5原型继承来正确扩展Function构造函数?保持实例的功能行为。还是ES6类的特定行为?