JS继承-类继承

类:ES5及更早的版本中JS是没有类这个概念的,这里的类是构造函数,把构造函数看做是类做继承。

function Aaa(){
  this.name = 'cat';
}
Aaa.prototype.showName = function(){
  alert(this.name);
};
function Bbb(){}
Bbb.prototype = new Aaa();
var b1 = new Bbb();
b1.showName();

代码分析:通俗易懂的分析语句-首先,创建了构造函数Aaa,它里面有个属性,然后它的原型上有个方法,这个时候把Aaa看做是儿子,把Aaa的prototype看做是爸爸,接下来,创建了个构造函数Bbb,Bbb也是儿子,Bbb的原型也是爸爸,接下来,关键的一步了啊,Bbb的爸爸和Aaa拜把子了,他俩就是一个人了,Aaa的爸爸也就是Bbb的爸爸的爸爸了,这个时候Bbb就和Aaa的prototype有关系了,Bbb就可以用Aaa的prototype身上的方法了。然后b1实例化了Bbb,相当于b1认Bbb做爸爸,这个时候b1就是Aaa的prototype的儿子(干儿子,Bbb的prototype)的孙子,b1就可以顺着这条关系链(原型链)用那些属性或者方法了。
代码分析完了,对类继承应该有一个初步的理解了,好了,上面的代码是有问题的。它会对属性也进行继承,换句话说就是可以修改Aaa的属性了,这是不可以忍的。问题出在了,赋值的那一句,对象和对象的赋值,会涉及对象的引用。
修改版:

function Aaa(){
  this.name = 'cat';
}
Aaa.prototype.showName = function(){
  alert(this.name);
};
function Bbb(){
  Aaa.call(this);
}
var F = function(){};
F.prototype = Aaa.prototype;
Bbb.prototype =new F();
Bbb.prototype.constructor = Bbb;
var b1 = new Bbb();
b1.showName();

分析这段代码:F复制保存了一下Aaa的原型,并没有复制属性,所以这个时候Bbb就拿不到Aaa的属性,只能找到Aaa的原型,然后需要手动修正Bbb的原型的构造函数指向,指回Bbb,不修改的话会跑偏;方法继承完毕了,属性继承还是用老方法(在子类的构造函数里面调用父类的构造函数),在Bbb函数体内调用Aaa.call(this);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值