原型链的继承
// 原型链继承/** * 外围:将父类的实例作为子类的原型 * 长处:办法复用 * 因为办法定义在父类的原型上,复用了父类的构造函数办法,比方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]