继承
一、类式继承
二、原型链继承
三、组合继承
- 类式继承
实现:在子类函数内部,使用call()、apply()、bind()改变父类内部this指向,指向子类创建的实例。
例子:
//父类
function People(name, age) {
this.name = name;
this.age = age;
}
//原型方式设置共有属性
People.prototype.eyes = "眼睛";
//子类
function Teacher(name, age) {
People.call(this, name, age);//方法一: call()
People.apply(this, [name, age]);//方法二: apply()
var fuc = People.bind(this, name, age);//方法三: bind()
fuc()
// 1. call和apply区别在于apply的第二个参数必须是数组类型,
// 所有传的参数必须存放在数组中。
// call的可以是任意类型, 但是参数需要单独传递。
// 2. bind的参数和call的一致, 但call和apply都是立即执行, bind是返回一个函数,
// 需要调用函数后执行。
}
var tea = new Teacher("老陈", 26) //{name:"老王",age:26}
console.log(tea);
//{}
console.log(Teacher.prototype)
缺点:不是真正的继承,子类不能拥有父类原型的属性。 子类原型没有继承父类的属性,不能实现复用。
优点:可以向父类传递参数
- 原型式继承
实现:将父类的实例赋值给子类的原型。
例子:
//父类
function People() {
this.name = "张三"
}
People.country = "中国";
//子类
function Teacher() {}
Teacher.prototype = new People();
var tea = new Teacher();
console.log(tea); //{name:"张三",country:"中国"}
console.log(Teacher.prototype); //{country:"中国"}
缺点:不能在创建子类实例时向父类传参
优点:子类的原型能够拥有父类原型以及实例的属性,可以复用
- 组合式继承
实现:将父类的实例赋值给子类的原型。
例子:
//父类
function People(name, age) {
this.name = name;
this.age = age;
}
People.country = "中国";
//子类
function Teacher(name, age) {
People.call(this, name, age);
}
Teacher.prototype = new People();
var tea = new Teacher("老王", 24);
console.log(tea); //{country:"中国",name:"老王",age:24}
console.log(Teacher.prototype); //{country:"中国"}
优点:既能向父类传参,又能继承父类原型的属性,实现真正意义上的继承,可复用。