• js的各种继承


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

    如图:借用__proto__一级一级实现原型链(一般最后为Object.prototype.proto = null)

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

    代码:
        <script>
            function Parent() {
                this.parentName = 'zzz';
            }
            Parent.prototype.getParent = () => {
                return 'parent'
            };
    
            function Child() {
                this.childName = '233';
            }
    
            Child.prototype = new Parent();
            Child.prototype.getChild = () => {
                return 'Child'
            };
            let child = new Child();
            console.log(child);
        </script>
    

    结构如下:

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

    2、es6语法实现继承

    代码:
        <script>
            class Parent {
                constructor() {
                    this.parentName = 'zzz';
                }
                getParent() {
                    return 'parent';
                }
            }
            class Child extends Parent {
                constructor() {
                    super(); //调用父类
                    this.childName = '233';
                }
                getChild() {
                    return 'child';
                }
            }
            let child = new Child();
            console.log(child);
        </script>
    

    结构如下:

    作用:方法存在于原型链中,构造函数定义的实例属性被复制到子类中
    修改代码为:

        <script>
            class Parent {
                constructor() {
                    this.parentName = {
                        name: 'parentname',
                        age: {
                            number: 22
                        }
                    }
                }
                getParent() {
                    return 'parent';
                }
            }
            class Child extends Parent {
                constructor() {
                    super(); //调用父类
                    this.childName = '233';
                }
                getChild() {
                    return 'child';
                }
            }
            let parent = new Parent();
            let child = new Child();
            parent.parentName.age.number = 2020;
            console.log(parent);
            console.log(child);
        </script>
    

    得出结果为:引用类型的复制为深拷贝

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

    代码:

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

    结构如下:

    作用:
    会继承父类构造函数里的属性和方法,但不会继承父类的原型中的属性和方法

    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;
    

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

  • 相关阅读:
    TypeScript & JSDoc All In One
    k8s & Docker All In One
    How to custom your own Node.js Docker Image All In One
    rollup & TypeScript & tslib All In One
    Linux file system All In One
    how to use npm delete one history version package All In One
    How to use Web Components in React or Vue All In One
    看了这篇使用 dist 发布 npm 包的文章,我整个人都栓Q 了
    yarn 1.x & yarn 2.x All In One
    python中删除字符串中的指定字符
  • 原文地址:https://www.cnblogs.com/Zxq-zn/p/12289779.html
Copyright © 2020-2023  润新知