为了账号安全,请及时绑定邮箱和手机立即绑定

为什么有必要设置原型构造函数?

为什么有必要设置原型构造函数?

MMTTMM 2019-06-18 13:47:06
为什么有必要设置原型构造函数?在MDN文章中有关继承的一节面向对象Javascript简介,我注意到他们设置了原型.构造函数:// correct the constructor pointer because it points to PersonStudent.prototype.constructor = Student;这有什么重要的用途吗?可以省略吗?
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

这有什么重要的用途吗?

是和不是。

在ES5和更早版本中,JavaScript本身没有使用constructor为了任何事。它定义了函数的默认对象prototype属性,并且它将引用该函数,并且就这样..说明书中没有任何其他内容提到它。

这在ES 2015(ES6)中发生了变化,它开始在继承层次结构中使用它。例如,Promise#then使用constructor你对它的承诺的属性(通过物种构造)在建立新的回报承诺的时候。它还涉及到子类型数组(通过ArraySpeciesCreate).

在语言本身之外,有时人们在试图构建通用的“克隆”函数时会使用它,或者只是当他们想要引用他们认为是对象的构造函数的时候。我的经验是,使用它是罕见的,但有时人们确实使用它。

可以省略吗?

默认情况下,您只需要将它放回取代函数上的对象prototype财产:

Student.prototype = Object.create(Person.prototype);

如果你不这么做

Student.prototype.constructor = Student;

.那么Student.prototype.constructor继承自Person.prototype(大概)constructor = Person..所以这是误导。当然,如果您正在子类使用它(比如PromiseArray)和不使用class(为您处理此问题),您需要确保设置正确。所以基本上:这是个好主意。

如果您的代码(或您使用的库代码)中没有任何东西使用它,这是可以的。我一直确保它的连线正确。

当然,还有ES 2015(又名ES6)class关键字,大多数时候我们都会使用它,我们不必再使用它了,因为当我们使用它的时候,它就会为我们处理。

class Student extends Person {}

¹ “.如果您正在子类使用它的东西(比如PromiseArray)和不使用class..."-它是.可能这样做,但这是一个真正的痛苦(有点傻)。你必须用Reflect.construct.


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 359 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信