js的继承的方式

1.对象冒充继承

使用 bind,call,apply 解决构造函数属性的继承

缺点:不能继承原型上的属性和方法

js 复制代码
  //-------------父类-------------

        function Person(name, age, sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        Person.prototype.run = function () {
            console.log(`我${this.name},爱跑步!`);
        }
        
        //-------------子类-------------
        function Student(sNo, name, age, sex) {
            //对象的冒充
            // bind,call,apply
            Person.call(this, name, age, sex);
            //后面
            this.sNo = sNo;
        }

        var s1 = new Student(10001, "刘德华", 20, "男");
        console.log(s1);
        s1.run()

2.原型链继承

缺点:不能让构造函数的属性,初始化

js 复制代码
   //-------------父类-------------
      function Person(name, age) {
        this.name = name;
        this.age = age;
      }
      Person.prototype.name = "刘德海";
      Person.prototype.run = function () {
        alert(123);
      }

      //-------------子类-------------
      function Student() {
      }
      //我只实现了原型继承,构造函数内部的属性,是无法设置初始值
      Student.prototype = new Person();
      var s2 = new Student();
      console.log(s2);
      // s2.run()
      console.log(s2.address);

3.组合继承(对象冒充+原型链继承)

缺点:原型中会有多余的属性,并且是undefined

js 复制代码
   //-------------父类-------------
      function Person(name, age) {
        this.name = name;
        this.age = age;
      }
      Person.prototype.name = "刘德海";
      Person.prototype.run = function () {
        alert(123);
      }

      //-------------子类-------------
      function Student() {
      }
      //我只实现了原型继承,构造函数内部的属性,是无法设置初始值
      Student.prototype = new Person();
      var s2 = new Student();
      console.log(s2);
      // s2.run()
      console.log(s2.address);

4.寄生组合继承

寄生继承+对象冒充继承=寄生组合继承

寄生组合继承 Object.create(base.prototype);

js 复制代码
   // 寄生继承,解决原型问题
        // 寄生继承+对象冒充继承=寄生组合继承
        function inherit_proto(base, child) {
            // 1.创建父类原型,根据父类的原型,创建一个新的对象
            var basePrototype = Object.create(base.prototype);
            // 2.创建的原型对象,它的构造还是指向原来的构造函数
            // 我们就修改子类的构造器
            basePrototype.constructor = child
            // 3.让自己拥有父类的原型
            child.prototype = basePrototype
            console.log(basePrototype);
        }
        // 父类
        function Person(name, age, sex) {
            this.name = name
            this.age = age
            this.sex = sex
        }
        Person.prototype.sayHi = function () { }

        // 子类
        function Student(sNo, name, age, sex) {
            Person.call(this, name, age, sex)
            this.sNo = sNo
        }
        // 调用方法
        inherit_proto(Person, Student)
        var stu = new Student("1001", "小易", 22, "女")
        console.log(stu);

5.ES6的类+extends继承

js 复制代码
  class Person {
            constructor(name, age) {
                this.name = name
                this.age = age
            }
            run(){
                return  `跑步`
            }
        }
        class Student extends Person {
            constructor(name, age, sex) {
                super(name, age)
                this.sex = sex
            }
            // 重写:子类重写父类的方法
            run(){
                return  `哈哈哈哈哈哈或`
            }
        }
        var p=new Student("小易",22,"女")
        console.log(p.run());
        console.log(p);
相关推荐
To_OC4 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC5 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic5 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy5 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志5 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble6 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长7 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯7 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜8 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司8 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能