对象继承的方式
这篇是上一篇的姐妹篇,面试中你有被问到-javascript中有几种创建对象的方式吗?这两篇结合起来,能更好地理解对象。开始吧!
01
原型链
原理:将父类的实例赋给子类的prototype

缺点:
实例的类型是不能直观看到的;
在创建子类型时,虽然可以传参,但容易造成修改的混乱。
02
构造函数结合原型链
原理:
使用call继承构造函数的属性和方法;
将父类的实例赋给子类的prototype继承父类的属性和方法,以及构造函数原型的方法

缺点:
由于调用了两次父类的构造函数,所以子类的原型中多了很多多余的属性
03
原型式继承
Object.getPrototypeOf()方法可以用来从子类上获取父类,判断一个类是否继承了另一个类
Object.setPrototypeOf(),为现有对象设置原型,返回一个新对象:
接收两个参数:第一个是现有对象,第二是原型对象。

缺点:
不能传参,即使传参也会被忽略
04
寄生式继承
原理:利用Object.create()将父类复制给子类,子类再进行拓展

缺点:
使用不方便
05
寄生式组合继承
原理:
利用call()获取父类的属性和方法,并将指针指向子类
利用Object.defineProperty获取Person.prototype中的属性和方法
Object.defineProperty方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty 需要三个参数(object , propName , descriptor)
1 object 对象 => 给谁加
2 propName 属性名 => 要加的属性的名字 【类型:String】
3 descriptor 属性描述 => 加的这个属性有什么样的特性【类型:Object】

06
extends关键字实现继承
super作为函数调用时,代表父类的构造函数--ES6要求,子类的构造函数必须执行一次super函数,否则会报错;
super虽然代表了父类Person的构造函数,但返回的是子类Coder的实例,即super内部的this指向的是Coder的实例。因此super()在这里相当于Person.prototype.contructor.call(this)
