js中的继承
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中的继承相关的知识,希望对你有一定的参考价值。
自己对于javascript继承的概念总是一知半解,知道那么一回事但是又说不上来,今天好好总结一下,希望能够把这块给弄清楚。
一、首先需要知道:js主要是通过原型链来继承。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
二、那么要简单粗暴地实现继承的话,有这么一句话就够了:
Child.prototype = new Parent();
当然仅仅这行代码是万万不够的,它有很多问题:
1、Child的constructor指向了Parent的实例;
2、子类不仅继承了方法,还继承了超类构造函数里面的属性;
3、子类的修改会影响超类。
三、带着这些问题,我们可以想尽办法去解决掉这些麻烦,由此引申更佳的继承方式:组合继承、原型式继承、寄生组合式继承
四、先说组合继承(又叫经典继承或者类式继承),请看下面代码:
function Parent(name){ this.name = name; this.colors = [‘red‘, ‘blue‘, ‘green‘]; } Parent.prototype.showName = function (){ alert(this.name); } function Child(name, age){ Parent.call(this, name);//使用借用构造函数继承实例属性 this.age = age; } // 关键:利用空的构造函数 // 使用原型链继承共享的属性和方法 var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; //注意还原子类的constructor指向
组合继承的关键是分开继承实例属性以及共享属性和方法,避免了单独使用原型链和借用构造函数的缺陷,是js中最常用的继承方式。
五、原型式继承,它是在2006年被被提出来的一个概念,代码如下:
function object(o){ function F (){};//创建一个临时的构造函数 F.prototype = o;//将传入的对象作为这个构造函数的原型 return new F();//返回这个临时类型的一个实例 } // 本质上讲:object()对传入的对象执行了一次浅复制
后来es5新增了Object.create()方法来规范了原型式继承,它在只传一个参数的情况下与object()方法一样。
Object.create()可以有第二个参数,这里就不详细说明了。
那么问题来了,这个原型式继承有什么缺点呢?
它的缺点就是子类实例修改包含引用类型值的属性的话,父类也会随之改变。(包含引用类型值的属性始终都会共享相应的值)
当然如果只是想让一个对象与另一个对象保持类似的情况下,原型式继承是可以胜任的。
六、还有其他的继承方式比如:寄生式继承和寄生组合式继承,有时间会去研究。
以上是关于js中的继承的主要内容,如果未能解决你的问题,请参考以下文章