【JS】继承

版权声明:我的博客我做主! https://blog.csdn.net/lk1822791193/article/details/82769026

前言

虽然js是一种面向对象的弱类型语言,但是它的继承性也非常的强大的!

其实在前边的原型与原型链的时候,我已经说到了继承(改变原型指向),但是并不全面,所以今天给大家介绍其他继承方式!

代码

    <script>
       function Person(age,sex,name){
            this.age= age;
            this.sex= sex;
            this.name= name;
        }
        Person.prototype.play=function(){
            console.log("play baskerball");
        }
        
        //prototype inheritance
        //原型链继承
        function SmallStudent(study){
            this.study=study;
        }
        SmallStudent.prototype=new Person(12,"man","Eric");
        
        SmallStudent.prototype.haveclass=function(){
            console.log("study class");
        }
        
        var sstu = new SmallStudent(100);
        
        sstu.play();
        sstu.haveclass();
        console.log(sstu);
        
        //contructor inheritance
        //构造函数继承
        function BigStudent(smile,age,sex,name){
            Person.call(this,age,sex,name);
            this.smile=smile;
        }
        var bstu =new BigStudent(20,"man","Divde","haha");
        console.log(bstu.smile)
        
        //example inheritance
        //实例继承
        function Student1(name){
            var stu1 =new Person();
            stu1.name=name || "Tom";
            return stu1;
        }
        
        var stu1 =new Student1();
        console.log(stu1.name);
        console.log(stu1.play);
        
        //group inheritance(contructor and prototype inheritance)
        //组合继承
        function Teacher(smile,age,sex,name){
            Person.call(this,age,sex,name);
            this.smile=smile;
        }
        
        Teacher.prototype=new Person();
        
        var teacher =new Teacher(25,"women","Admin","haha");
        console.log(teacher.age,teacher.sex,teacher.name,teacher.smile);
        teacher.play();             
        
        //copies of the inheritance
        //深复制继承       
        var s1={};
        for(var key in teacher){
            s1[key]=teacher[key]
        };

        console.dir(s1.age);
        s1.play();

        //浅复制继承
        var s2=teacher;       
        
        console.dir(s2.age);
        s2.play();     
        
    </script>

对比

继承名称 继承方式 优点 缺点
原型链继承 改变原型指向

1.可以继承新指向的属性和方法

2.简单,易于实现

1.所有属性都初始化,无法修改

2.无法实现多继承

3.创建子类实例时,无法向父类构造函数中传参

构造函数继承

调用其他构造函数

function name.call(this)

1.解决了原型继承所有属性都初始化的问题

2.创建实例时,可以向父类传递参数

3.可以实现多继承

1.无法继父类的方法和实例属性

2.无法实现函数复用

实例继承

为父类添加新特性

作为子类实例返回

1.不限制调用方式

1.实例是父类的实例

2.不支持多继承

组合继承 原型继承+构造函数继承

1.集合了它俩的优点

2.解决了它俩的问题

1.调用了两次父类的构造函数

2.生成了两份实例

浅复制继承

(拷贝继承)

指针拷贝 1.方便快捷

1.一个对象修改所有拷贝的内容都会随之修改

(牵一发而动全身)

深复制继承

(拷贝继承)

把一个对象中的属性和方法

通过循环遍历的方式

拷贝到一个新的对象当中

1.支持多继承

1.效率比较低

2.无法获取父类的枚举方法

简单总结分享,有什么问题欢迎大家和我交流,感谢大家认真阅读和点赞鼓励!

猜你喜欢

转载自blog.csdn.net/lk1822791193/article/details/82769026