javascript 高级程序设计 8.3.3 组合继承

43 阅读1分钟

组合继承: 通过原型链继承原型上的属性和方法,通过盗用构造函数继承实例属性.

把想要复用的函数和基本数据类型放在原型中.把每个实例都要是自己独一份的数据放在盗用的构造函数里.

// 定义父类构造函数
function father(name) {
    this.name = name
    this.color = ['red','green']
}
father.prototype.sayName = function() {
    console.log(this.name)
}
// 定义子类构造函数
function son(name,age) {
    // 继承属性
    father.call(this,name)
    this.age = age
}
// 子类继承父类原型上的方法
son.prototype = new father()
// 子类定义自己的方法
son.prototype.sayAge = function() {
    console.log(this.age)
}
// 产生两个实例
let son1 = new son('张三',20)
son1.color.push('blue')
console.log(son1.color) // ['red','green','blue']
son1.getName() // '张三'
son1.getAge() // 20
let son2 = new son('李四',18)
console.log(son2.color) // ['red','green']
son2.getName() // '李四'
son2.getAge() // 18

 在这个例子里,父类构造函数中的属性,被子类盗用,故而子类的实例可以拥有自己的属性.同时,子类的原型还被赋值了父类的实例,这样子类就可以使用父类的原型中的方法和属性了.

组合继承,合并了原型链和盗用构造函数的优点,弥补了二者的不足,是js里用到最多的继承方式.并且由于继承了原型,还能通过isPrototypeOf()和isinstanceof方法去判断其原型关系.