zoukankan      html  css  js  c++  java
  • js继承的几种方式

    最近在面试的时候,遇到过两次问继承实现的几种方式,这里能我给大家列举了以下的这几种,给大家参考参考

    方式一:借助构造函数实现继承

    这里使用的原理就是在Child里面,把Parent的this指向改为是Child的this指向,从而实现继承

    function Parent(name){
        this.name=name;
        }
        Parent.prototype.saiHi=function(){
            console.log("hello")
        }
        function Child(name,age,gender){
            Parent.call(this,name)
            this.age=age;
            this.gender=gender;
        }
        let child=new Child("王磊",20,"男")
        console.log(child.name);// 王磊
        child.sayHi(); // Uncaught TypeError:child.sayHi is not a function

    缺点:只能解决属性的继承,使用属性的值不重复,但是父级类别的方法不能继承

    方式二:借助原型链实现继承

    第二种方式就是把Child的原型改为是Parent的实例,从而实现继承

         function Parent(name,gender){
                this.name=name;
                this.gender=gender;
                this.list=[1,2,3]
            }
            Parent.prototype.eat=function(){
                console.log("晚餐时间到")
            }
            function Child(age){
                this.age=age;
            }
            Child.prototype=new Parent("李白","男");
            var child=new Child(20);
            var child2=new Child(30);
            child.eat();
            console.log(child.list,child2.list);// [1,2,3] [1,2,3]
            child.list.push(4)
            console.log(child.list);// [1,2,3,4]        
            console.log(child2.list);// [1,2,3,4]

    缺点:因为Child的原型对象都是New Parent,所以实例化出来的对象的属性都是一样的,而且Parent上面的引用类型只要有一个实例对象修改了,其他也会跟着修改.因为他们原型对象都是共用的

    方式三:组合型

    方式三的话是结合了方式一和方式二来实现继承

    function Person(school){
                this.school=school;
            }
            Person.prototype.skill=function(){
                console.log("学习");
            }
            function Student(school,name,age,gender){
                Parent.call(this,school);
                this.name=name;
                this.age=age;
                this.gender=gender;
            }
            Student.prototype=Person.prototype;
            let student=new Student("广铁一中","王菲菲",14,"女");
            console.log(Student.prototype===Person.prototype)
            console.log(student.constructor)

    缺点:父类的原型对象调用了两次,没有必要,而且student实例的构造函数是来自于Person

    方式四:组合方式优化

    function Parent(name,play){
                this.name=name;
                this.play=play;
            }
            function Child(name,play,age){
                Parent.call(this,name,play);
                this.age=age;
            }
            Child.prototype=Parent.prototype;
            let child=new Child("张三","玩",20);
            let child2=new Child("李四","吃",10)
            console.log(child,child2)
            console.log(child.prototype===child2.prototype); true
            console.log(child.constructor); // 构造函数指向的是Parent

    缺点:child实例的构造函数来自于Parent

    方式五: 组方式优化

    只是这种方式的话,你必须得理解Object.create()方法的使用,他创建的对象是在原型上面的

    function Parent(name,play){
                this.name=name;
                this.play=play;
            }
            function Child(name,play,age){
                Parent.call(this,name,play);
                this.age=age;
            }
            Child.prototype=Object.create(Parent.prototype);// 隔离了父类和子类的构造函数,父类的添加到了__proto__属性上
            Child.prototype.constructor=Child
            let child=new Child("张三","玩",20);
            let child2=new Child("李四","吃",10)
           
            console.log(child.constructor)
  • 相关阅读:
    2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest
    2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
    BZOJ5104 : Fib数列
    2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1)
    2017 ACM Jordanian Collegiate Programming Contest
    BZOJ4910 : [Sdoi2017] 苹果树
    2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
    BZOJ4912 : [Sdoi2017]天才黑客
    BZOJ4739 : 定向越野
    概率笔记11——一维正态分布的最大似然估计
  • 原文地址:https://www.cnblogs.com/cythia/p/11175343.html
Copyright © 2011-2022 走看看