JavaScript 类继承与原型继承的区别
在 ES6 之前,JavaScript 实现两个对象的继承一般有两种方法。
一种方法是利用 this 与构造函数。
function Parent(name,height) { this.name = name; this.height = height;}function Child(age) { Parent.apply(this,['hahaha',171]) this.age = age;}let ch = new Child(21);console.log(ch.name)在这种方法中,利用 apply 或者 call,在一个函数中改变了另一个函数的 this 指向并运行。结果是一个构造函数的实例,继承了另一个构造函数的属性和方法。这种方法有一个缺点,对于原型链上的继承没有实现。
另一种方法是利用原型链实现属性的继承。
function Parent(name,height) { this.name = name; this.height = height;}function Child(age) { this.age = age;}Child.prototype = new Parent('hahaha',171);let ch = new Child(21)console.log(ch.name)这种方法与其说是继承,不如说是一种查找规则。JavaScript 中假如在一个对象中找不到相关属性和方法,就会沿着原型链向上查找。在这段代码中,将 Child 的原型对象设置为 Parent 的一个实例,也就是将 Child 实例原型链的上一层设置为 Parent 的一个实例。由此实现了一个对象继承了另一个对象的效果。
这种方法也有个缺点,继承了同一个原型的两个实例之间相互影响。
在 ES6 之后,有了类的书写方法。
class Fruit { constructor (name,quantity){ this.name = name; this.quantity = quantity; } static show() { return 'show' } getName() { return this.name; }}class Apple extends Fruit { constructor (name,quantity,area) { super(name,quantity); this.area = area; }}let apple = new Apple('apple',3,'shan');console.log(Apple.show() +':'+ apple.getName()+' ' + apple.quantity)// show:apple 3类的继承语法更直观,书写更简便,它与 ES5 的继承有几点不同。
getPrototypeOf 结果不同
类继承中子类会 [[Prototype]] 链接到父类,原型继承中的构造函数都是通过 prototype 指向的原型对象相互联络的。一般在原型继承中,子构造函数的原型对象是父构造函数,或者者子构造函数的原型对象 [[Prototype]] 链接到父构造函数的原型对象。this 创造顺序不同
ES5 的继承,实质是先创造子类的实例对象this,而后再将父类的方法增加到this上面(Parent.apply(this))。ES6 的继承先将父类实例对象的属性,加到this上面(所以必需先调用super方法),而后再在子类中修改this。子类实例的构建,基于父类实例,只有super方法才能调用父类实例。
参考文章阮一峰: Class 的继承
James Harris 2017-01-20 08-48-05 .jpg
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » JavaScript 类继承与原型继承的区别