2025-3.20学习复盘

ES5类的继承

属性继承

  父类.方法.call(this,参数1,参数2,......)
  父类.方法.apply(this,[参数1,参数2,.....])
    //父类
    function Person(name, color, weight, hight) {
      this.name = name;
      this.color = color;
      this.weight = weight;
      this.hight = hight;
      Person.prototype.sleep = function () {
        return '正在睡觉'
      }
      Person.prototype.eat = function () {
        return '正在吃饭'
      }
    }
    //子类
    function Student(name, color, weight, hight, sno, grade) {
      //this借用
      //被借用的对象.方法.call(需要借的对象,参数1,参数2,.....)
      /* Person构造函数全局定义的,有个最顶级的对象Window,所以这儿被借用的对象是Window,
      在Student构造函数中this指向的是实例对象,也就是需要修改的对象,所以这里需要借的对象是this 后面就跟对应的属性 */
      /* window.Person.call(this, name, color, weight, hight)  Window可以不写
        所以属性继承是:
        父类.方法.call(this,参数1,参数2,......)
        父类.方法.apply(this,[参数1,参数2,.....]) */
      Person.call(this, name, color, weight, hight)
      this.sno = sno;
      this.grade = grade;
    }
    let p1 = new Person('小天', '黄皮肤', 60, 170)
    console.log(p1);
    let s1 = new Student('小天', '黄皮肤', 60, 170, 123456, '大三')
    console.log(s1);

原型继承

原型链继承
  
  子类.prototype.__proto__ = 父类.prototype

Student构造函数实例化的对象s1通过__proto__去它的显式原型里面找eat方法,没找到,然后通过原型链:逐级向上,就近原则,在它的prototype里通过__proto__去找到Object的显式原型里,还是没有,如果在Objectprototype里在通过__proto__去找,就是null了 所以直接s1.eat()0会报eat is not a function的错

问题就出在最长的那根红线,所以想找到eat方法,就应该如图更改指向

即:Student.prototype.__proto__ = Person.prototype

     //父类
    function Person(name, color, weight, hight) {
      this.name = name;
      this.color = color;
      this.weight = weight;
      this.hight = hight;
      Person.prototype.sleep = function () {
        return '正在睡觉';
      }
      Person.prototype.eat = function () {
        return '正在吃饭';
      }
    }
    //子类
    function Student(name, color, weight, hight, sno, grade) {
      //this借用
      //被借用的对象.方法.call(需要借的对象,参数1,参数2,.....)
      /* Person构造函数全局定义的,有个最顶级的对象Window,所以这儿被借用的对象是Window,
      在Student构造函数中this指向的是实例对象,也就是需要修改的对象,所以这里需要借的对象是this 后面就跟对应的属性 */
      /* window.Person.call(this, name, color, weight, hight)  Window可以不写
        所以属性继承是:
        父类.方法.call(this,参数1,参数2,......)
        父类.方法.apply(this,[参数1,参数2,.....]) */
      Person.call(this, name, color, weight, hight)
      this.sno = sno;
      this.grade = grade;
      Student.prototype.study = function () {
        return '正在学习'
      }
      //继承原型空间
      Student.prototype.__proto__ = Person.prototype
    }
    let p1 = new Person('小天', '黄皮肤', 60, 170)
    console.log(p1);
    let s1 = new Student('小天', '黄皮肤', 60, 170, '123456', '大三')
    console.log(s1);
    console.log(s1.sleep());
    console.log(s1.eat());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值