JS中的原型继承

本文主要是讲通过原型去实现继承

假如有如下代码:

function A() {
    this.name = 'A';
};
function B() {
    this.name = 'B';
};
A.prototype.whatever = function () {
    /*  write some code   */
};
B.prototype = new A()/*注意一下,这句代码是关键,实现了B继承A*/
B.prototype.constructor = B;//这句代码的作用主要是把B的constructor重设为B,要不然就会指向A
var c = new A();    
var b = new B();    

要实现继承,就必须保证B继承A以后,B所做的修改不能影响到A以及继承自A的其他对象.

这里主要介绍一下B.prototype = new A(),这句关键性的代码所起的作用,

如果把这句代码改成B.prototype = A的话,那么这两个对象的引用是完全一致的,这样的话,如果赋值B.prototype.name = 45455,那么A.name也会直接变成45455,直接把继承自A的其他对象全部改了,根本谈不上继承.

如果把这段代码改成B.prototype = A.prototype的话,也同样会出现一样的问题,修改B的原型就会把A的原型污染掉.

而B.prototype = new A()这句代码,创建了一个新的json对象{},并且继承了A的原型,这里是一个新的对象,而不是和A的同一个引用,所以不会污染到A.

现在,我们先把 B.prototype 改成另外一个名字XXX,叫做XXX=new A();,当你请求XXX的whatever的时候,此时他不存在,将会向上,从构造函数也就是A里面去找,也就是如下的效果:

B.prototype.whatever = XXX.whatever = A.prototype.whatever ;

就顺利的请求到值了,并且不会污染到A.

总结:B完全继承了A的东西,只要A原型里有的,B的实例(通过new B产生的)都可以拿到,但是修改实例的属性和方法,并不会影响到类(在本例子中指的就是构造函数),修改子类的属性和方法不会影响父类,不同实例之间是不同的对象,并不相等

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值