js中的继承方法总结

原创 青春正当时 随笔 JavaScript 224阅读 2018-06-20 14:13:37 举报

「JavaScript」js中的继承方法总结

1.原型链继承
代码如下:

这样看来貌似可以完美完成继承,然后当属性换成引用类型时,就会出现问题了,如下:

由此我们可以得出原型链继承的缺点:

引用类型的属性被所有实例共享
在创建Child实例时,不能向Parent传参

2.借用构造函数继承

可以看出,借用构造函数继承避免了一下原型链继承的问题,主要体现在:

避免了引用类型的属性被所有实例共享
可以在Child中向Parent传参
然而,借用构造函数继承也有缺点。

缺点:方法都在构造函数中定义,每次创建实例都会创建一遍方法

3.组合继承
组合继承融合原型链继承和构造函数的优点,是JavaScript中最常用的继承模式

然而组合继承也有一个缺点,就是会调用两次父构造函数。

如下:

Child.prototype = new Parent();
var child1 = new Child('aa', '18');
所以,在这个例子中,如果我们打印 child1 对象,我们会发现 Child.prototype 和 child1 都有一个属性为colors,属性值为['red', 'blue']。

15439732565b28ca596b20a_articlex.png
这个问题我们在下面再讨论。

4.原型式继承

缺点:包含引用类型的属性值始终会共享相应的值,与原型链继承一样

5.寄生式继承
创建一个仅用于封装继承过程的函数,该函数在内部以某种形式做增强对象,最后返回对象

缺点:

跟借用构造函数模式一样,每次创建对象都会创建一遍方法
包含引用类型的属性值始终会共享相应的值

6.寄生组合式继承
还记得组合继承中提到的那些问题吗,那么我们该如何精益求精,避免这一次重复调用呢?

如果我们不使用 Child.prototype = new Parent() ,而是间接的让 Child.prototype 访问到 Parent.prototype 呢?可以这样实现:

这种方式的高效率体现它只调用了一次 Parent 构造函数,并且因此避免了在 Parent.prototype 上面创建不必要的、多余的属性。与此同时,原型链还能保持不变;因此,还能够正常使用 instanceof 和 isPrototypeOf。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复