JavaScript的ES3, ES5, ES6实现继承方式

前言

该篇博客涉及__proto__, prototype属性, 如果不是太了解, 参见下面这篇博客
https://blog.csdn.net/c_kite/article/details/78484191

ES3 继承

在JavaScript中,所谓的类就是函数,函数就是类。一般情况下,我们在函数的prototype上面定义方法,因为这样所有类的实例都可以公用这些方法;在函数内部(构造函数)中初始化属性,这样所有类的实例的属性都是相互隔离的。 我们定义ClassA和ClassB两个类,想让ClassB继承自ClassA。 ClassA代码如下所示:

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

ClassA.prototype.sayName = function () {
   
    console.log(this.name);
};

ClassA.prototype.sayAge = function () {
   
    console.log(this.age);
};

ClassA构造函数内部定义了nameage两个属性,并且在其原型上定义了sayNamesayAage两个方法。 ClassB如下所示:

function ClassB(name, age, job) {
   
    ClassA.apply(this, [name, age]);
    this.job = job;
}

ClassB新增了job属性,我们在其构造函数中执行ClassA.apply(this, [name, age]);,相当于在Java类的构造函数中通过super()调用父类的构造函数以初始化相关属性。

此时我们可以通过var b = new ClassB(“sunqun”, 28, “developer”);进行实例化,并可以访问b.nameb.ageb.job三个属性,但此时b还不能访问ClassA中定义的sayNamesayAage两个方法。

然后我们新增代码ClassB.prototype = ClassA.prototype;,此时ClassB的代码如下所示:

function ClassB(name, age, job) {
   
    ClassA.apply(this, [name, age]);
    this.job = job;
}
//新增
ClassB.prototype = ClassA.prototype;

当执行var b = new ClassB(“sunqun”, 28, “developer”);时,b.__proto__指向的是ClassB.prototype,由于通过新增的代码已经将ClassB.prototype指向了ClassA.prototype,所以此时b.__proto__指向了ClassA.prototype。这样当执行b.sayName()时,会执行b.__proto__.sayName(),即最终执行了ClassA.prototype.sayName(),这样ClassB的实例就能调用ClassA中方法了。

此时我们想为ClassB新增加一个sayJob方法用于输出job属性的值,如下所示:

function ClassB(name, age, job) {
   
    ClassA.apply(this, [name, age]);
    this.job = job;
}
ClassB.prototype = ClassA.prototype;
//新增
ClassB.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值