JavaScript 的对象继续体式格局,有几种写法?

一、对象假装

其道理以下:组织函数运用 this 关键字给一切属性和要领赋值(即采纳类声明的组织函数体式格局)。由于组织函数只是一个函数,所以可以使 Parent 组织函数 成为 Children 的要领,然后挪用它。Children 就会收到 Parent 的组织函数中定义的属性和要领。比方,用下面的体式格局定义 Parent 和 Children:

道理:就是把 Parent 组织函数放到 Children 组织函数内里实行一次。那为何不直接实行,非要转个弯把 Parent 赋值给 Children 的 method 属性再实行呢? 这跟 this 的指向有关,在函数内 this 是指向 window 的。当将 Parent 赋值给 Children 的 method 时, this 就指向了 Children 类的实例。

二、原型链继续

尽人皆知,JavaScript 是一门基于原型的言语,在 JavaScript 中 prototype 对象的任何属性和要领都被通报给谁人类的一切实例。原型链应用这类功能来完成继续机制:

注重:挪用 Parent 的组织函数,没有给它通报参数。这在原型链中是规范做法。要确保组织函数没有任何参数。

三、运用 call 或 applay 要领

这个要领是与对象假装要领最类似的要领,由于它也是经由过程改变了 this 的指向而完成继续:

apply 要领本人就不举列了,它和 call 要领的区分在于它的第二个参数必需是数组。

四、夹杂体式格局

对象假装的重要问题是必需运用组织函数体式格局,这不是最好的挑选。不过假如运用原型链,就没法运用带参数的组织函数了。怎样挑选呢?答案很简单,二者都用。 在 JavaScript 中建立类的最好体式格局是用组织函数定义属性,用原型定义要领。这类体式格局一样适用于继续机制:

五、运用 Object.create 要领

Object.create 要领会运用指定的原型对象及其属性去建立一个新的对象:

@ 当实行 Children.prototype = Object.create(Parent.prototype) 这个语句后,Children 的 constructor 就被改变成 Parent ,因而需要将 Children.prototype.constructor 重 新指定为 Children 本身。

六、extends 关键字完成继续

这个是 ES6 的语法糖,下面看下es6完成继续的要领:

上面代码中,子类的constructor要领没有挪用super之前,就运用this关键字,效果报错,而放在super要领以后就是准确的。子类Children的组织函数当中的super(),代表挪用父类Parent的组织函数。这是必需的,不然 JavaScript 引擎会报错。

注重,super虽然代表了父类Parent的组织函数,然则返回的是子类Children的实例,即super内部的this指的是Children,因而super()在这里相当于Parent.prototype.constructor.call(this)。

    原文作者:EternalZh
    原文地址: https://segmentfault.com/a/1190000018901534
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞