JS中的原型继承

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35770417/article/details/87954048

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

假如有如下代码:

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产生的)都可以拿到,但是修改实例的属性和方法,并不会影响到类(在本例子中指的就是构造函数),修改子类的属性和方法不会影响父类,不同实例之间是不同的对象,并不相等

猜你喜欢

转载自blog.csdn.net/qq_35770417/article/details/87954048