如何使用本机ES5原型继承适当扩展功能“类”?

时间:2019-06-27 12:22:27

标签: javascript class inheritance prototype ecmascript-5

在这一点上,对我当前的项目或任何其他东西都没有需求。只是想了解这些事情是如何工作的。

在我的“家庭项目”中,我避免使用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类的特定行为?

0 个答案:

没有答案