类的创建于继承

Author Avatar
AppleSun 7月 06, 2018

ES5中关于类的创建 : new 一个function,在function的prototype里面增加属性和方法

创建一个类

1
2
3
4
5
6
7
8
9
10
11
// 定义一个动物的类
function Animal (name) {
this.name = name || 'Animal';
this.sleep = function () {
console.log(this.name + '在睡觉');
}
}
// 原型方法
Animal.prototype.eat = function (food) {
console.log(this.name + '正在吃' + food);
}

这样子就生成了一个Animal类,实例化之后,有方法和属性

类的继承

  • 原型链继承

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 原型链继承
    function Cat() {};
    Cat.prototype = new Animal();
    Cat.prototype.name = 'cat';
    // test code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.eat('fish'));
    console.log(cat.sleep());
    console.log(cat instanceof Animal); //true
    console.log(cat instanceof Cat); //true
    • 介绍:一个空对象,指向Animal,并且 Cat.prototype 指向 这个空对象
    • 特点:基于原型链,既是父类的实例,也是子类的实例
    • 缺点:无法实现多继承
  • 构造继承

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Cat(name) {
    Animal.call(this);
    this.name = name || 'Tom';
    }
    // test code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.sleep());
    console.log(cat instanceof Animal); // false
    console.log(cat instanceof Cat); // true
    • 介绍:使用父类的构造函数来增强子类实例。等同于复制 父类的实例属性给子类
    • 特点:可以实现多继承
    • 缺点:只能继承父类实例的属性和方法
  • 组合继承

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Cat(name){
    Animal.call(this);
    this.name = name || 'Tom';
    }
    Cat.prototype = new Animal();
    Cat.prototype.constructor = Cat;
    // Test Code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.sleep());
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); // true
    • 介绍:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用

    • 特点:可以继承实例属性/方法,也可以继承原型属性/方法

    • 缺点:调用了两次父类构造函数,生成了两份实例

  • 寄生组合继承

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function Cat(name){
    Animal.call(this);
    this.name = name || 'Tom';
    }
    (function(){
    // 创建一个没有实例方法的类
    var Super = function(){};
    Super.prototype = Animal.prototype;
    //将实例作为子类的原型
    Cat.prototype = new Super();
    })();
    // Test Code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.sleep());
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); //true
    • 介绍:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性