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