Js继承 小结

继承

一、类式继承
二、原型链继承
三、组合继承

  1. 类式继承
    实现:在子类函数内部,使用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)

缺点:不是真正的继承,子类不能拥有父类原型的属性。 子类原型没有继承父类的属性,不能实现复用。
优点:可以向父类传递参数

  1. 原型式继承
    实现:将父类的实例赋值给子类的原型。
    例子:
//父类
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:"中国"}

缺点:不能在创建子类实例时向父类传参
优点:子类的原型能够拥有父类原型以及实例的属性,可以复用

  1. 组合式继承
    实现:将父类的实例赋值给子类的原型。
    例子:
//父类
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:"中国"}

优点:既能向父类传参,又能继承父类原型的属性,实现真正意义上的继承,可复用。

    原文作者:十___
    原文地址: https://www.jianshu.com/p/0bfae19e4282
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞