最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 理一理关于ES5和ES6的继承相关[博客]

    正文概述 掘金(fullmastach)   2021-02-19   396

    ES5的继承 - 原型链继承

    使用ES5实现一个简单的继承

    function Parent() {
        this.type = 'parent';
    }
    Parent.prototype.getType = function() {
        return this.type;
    }
    function Child(a, b) {
        this.a = a;
        this.b = b;
    }
    Child.prototype = new Parent();
    const c = new Child(3,4)
    console.log(c.getType()); // parent
    console.log(c instanceof Parent); // true
    console.log(c instanceof Child);  // true
    console.log(c.prototype === Parent._proto_); // true
    
    • 创建两个构造函数ParentChild
    • Parent的实例赋值给到Child的原型,从而实现将Parent的所有属性和方法继承到Child
    • 通过instanceof可以查看到实例c同时是ParentChild的实例。
    • 最后一次打印也很好的印证了继承的相关思想

    在创建一个构造函数的实例的时候,一般浏览器会主动在实例上添加一个_proto_属性。该属性指向构造函数的实例。故不难理解最后一次的打印为什么是true了。

    需要注意的是,在es5中使用构造函数创建对象的时候。该构造函数与普通的构造函数并没有说什么区别。我们定义的构造函数是可以直接执行的。所以首字母大写一般为了区分普通函数。

    ES6实现继承 - class关键字

    使用class关键字实现一个继承

    es6提出了class关键字用于定义类的概念。

    class Food {
        constructor() {
            this.name = 'food'
        }
        getName() {
            return this.name;
        }
    }
    
    class Vegetable extends Food {
        constructor() {
            super();
        }
    }
    
    const v = new Vegetable();
    console.log(v.getName()); //  food
    
    • 在ES6中我们实现一个继承需要借助extends关键字,并必须在Food类的构造方法中去执行super()方法来实现继承Food的属性和方法。

    关于super关键字的用法

    以上例子我们可以看到在继承中使用super作为方法调用,接下来我们看看super关于对象的用法

    class Food {
        constructor() {
            this.name = 'food';
            this.sex = 'male';
        }
        getName() {
            return this.name;
        }
        getNames() {
            return this.sex;
        }
    }
    Food.getType = () => {
        return 'is parent';
    }
    class Vegetable extends Food {
        constructor(sex) {
            super();
            this.sex = sex;
            console.log(super.getName()); // food
            console.log(super.getNames()); // famale
        }
        getType() {
            console.log(super.getType()) // 报错
        }
        static getParentType() {
            console.log(super.getType())
        }
    }
    
    const v = new Vegetable('famale'); // food
    v.getType();// 这句话执行之后会报错
    Vegetable.getParentType(); // is parent
    
    • 从上面的例子中可以看到在我们创建一个Vegetable的实例的时候直接打印了父类的方法getName
    • 可以总结下关于super的两个用法的区别,在作为方法调用的时候是用来将父级类的所有方法和属性挂到子类中相当于父类的constructor,当作为对象使用的时候。在普通方法中super指向的父类的原型对象在静态方法中使用指向的是父类本身。实际上就是一句话,super指向的是父类的原型对象而非父类本身。
    • 当使用super之后父类的this指向子类的this。通过打印 console.log(super.getNames())可以看出此特性。
    • super只能在constructor中调用方法,否则就会报错。

    起源地下载网 » 理一理关于ES5和ES6的继承相关[博客]

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元