ES5继承

104 阅读1分钟
        function Animal(name) {
            this.name = name
            this.foods = ['pork']
            this.run = function () {
                console.log('running')
            }
        }

        // 一、借用父类构造函数继承,缺点:1、无法继承到原型上的属性与方法;
        function Dog(name) {
            Animal.call(this, name)
        }

        // 二、原型链继承,缺点:1、不能向父类构造函数传参数
        function Cat(name) {
            this.name = name
        }

        Cat.prototype = new Animal()
        Cat.prototype.constructor = Cat
        var cat1 = new Cat("cat1")
        var cat2 = new Cat("cat2")
        // 2、实例对继承到的引用数据类型修改,会影响到所有其他实例
        cat1.foods.push('chicken')
        console.log('cat2.foods', cat2.foods) // ['pork', 'chicken']

        // 三、组合继承,缺点:会调用两次父构造函数
        function Chicken(name) {
            Animal.call(this, name)
        }
        Chicken.prototype = new Animal()
        Chicken.prototype.constructor = Chicken

        // 四、原型式继承,缺点:同原型链继承,实例对继承到的引用数据类型修改,会影响到所有其他实例
        function Pig(obj) {
            function Fn() { }
            Fn.prototype = obj
            return new Fn()
        }

        // 五、寄生式继承,缺点:同四
        function FatPig() {
            var pig = new Pig()
            pig.eat = function () {
                console.log('eat a lot')
            }
            return pig
        }

        // 六、寄生组合式继承
        function SuperPig() {
            Animal.call(this)
        }

        SuperPig.prototype = SuperPig(Animal.prototype)
        SuperPig.prototype.constructor = SuperPig