js的各种继承

1、实例,原型对象,构造函数之间的关系

如图:借用__proto__一级一级实现原型链(一般最后为Object.prototype.__proto__ = null)
js的各种继承_第1张图片

2、原型链继承:将父类构造函数的实例变成子类的原型

代码:
    

结构如下:
js的各种继承_第2张图片

作用:父类的方法和属性存在于原型两种,可以调用;缺点:父类中存在引用类型时,原型链调用会共享一个引用类型

2、es6语法实现继承

代码:
    

结构如下:
js的各种继承_第3张图片
作用:方法存在于原型链中,构造函数定义的实例属性被复制到子类中
修改代码为:

    

得出结果为:引用类型的复制为深拷贝
js的各种继承_第4张图片

3、利用call,apply的构造函数式继承

代码:

        function Child() {
            Parent.call(this);
            this.childName = '233';
        }

结构如下:
js的各种继承_第5张图片
作用:
会继承父类构造函数里的属性和方法,但不会继承父类的原型中的属性和方法

4、组合继承(混合原型链继承和构造函数继承)

关键代码:

        function Child() {
            Parent.call(this);
            this.childName = '233';
        }
        Child.prototype = new Parent();

作用:会继承父类及父类原型上的属性方法,缺点是调用了两次构造函数

5、寄生式组合继承

关键代码:

        function objectCreate(obj) {
            function F() {};
            F.prototype = obj;
            return new F();
        } //寄生,Object.create()??

        function Child() {
            Parent.call(this);
            this.childName = '233';
        }
        Child.prototype = objectCreate(Parent.prototype);
        Child.prototype.constructor = Child;

作用:解决组合式继承两次调用的问题

你可能感兴趣的:(js的各种继承)