// 原型链继承
/**
* 外围: 将父类的实例作为子类的原型
* 长处:办法复用
* 因为办法定义在父类的原型上,复用了父类的构造函数办法,比方 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 === Parent
console.log(Child.prototype.constructor === Parent) // true
// 一个残缺的原型对象必须有 constructor
Child.prototype.constructor = Child // 修改 constructor 指向
let boy1 = new Child()
let boy2 = new Child()
// 长处:共享了父类构造函数的 say 办法
console.log(boy1.say()) // hello
console.log(boy2.say()) // hello
console.log(boy1.say() === boy2.say()) // true
// 毛病 1 不能传参
console.log(boy1.name) // 父类
console.log(boy2.name) // 父类
console.log(boy1.name === boy2.name) // true
// 毛病 2 子类实例共享了父类的援用属性 比方 arr
boy1.arr.push(2)
// 批改了 boy1 的 arr,影响了 boy2 的 arr
console.log(boy2.arr) // [1,2]