原型链的继承

// 原型链继承/** * 外围:将父类的实例作为子类的原型 * 长处:办法复用 *     因为办法定义在父类的原型上,复用了父类的构造函数办法,比方say办法 * 毛病: *     创立子类实例的时候,不能向父类穿参数 *     子类实例共享了父类的构造函数的援用属性,比方arr属性 *     无奈实现多继承 *      *  * */  function Parent(name){    this.name = name || '父类' // 实例的根本属性(该属性强调公有,不共享)    this.arr = [1]  //  该属性强调公有,不共享}Parent.prototype.say = function (){ // 定义在原型对象上的办法(强调复用,须要共享)    console.log('hello')}function Child(like){    this.like = like}Child.prototype = new Parent()  // 外围,此时Child.prototype.constructor === Parentconsole.log( Child.prototype.constructor === Parent) //  true// 一个残缺的原型对象必须有constructorChild.prototype.constructor = Child // 修改constructor 指向let boy1 = new Child()let boy2 = new Child()// 长处:共享了父类构造函数的say办法console.log(boy1.say()) // helloconsole.log(boy2.say())  // helloconsole.log(boy1.say() === boy2.say())   // true// 毛病1   不能传参console.log(boy1.name) // 父类console.log(boy2.name) //父类console.log(boy1.name === boy2.name)  // true// 毛病2   子类实例共享了父类的援用属性 比方arrboy1.arr.push(2)// 批改了boy1的arr ,影响了boy2的arrconsole.log(boy2.arr)  // [1,2]