美文网首页
JS原型继承

JS原型继承

作者: 三生石上绛珠草 | 来源:发表于2017-03-15 20:52 被阅读18次

本文适合有C++面向对象编程经验的人。
声明:本文整理自JS高级编程,我本人没有任何原创性。

JS用蹩脚的方式实现了面向对象的特性,虽然不喜欢,然而不得不用JS,只好也就接受这种方式。(JS面向对象像XX,既然无力反抗,就尽情享受吧)
JS的继承有多种方式,不同方式解决了不同的问题。
JS有一个核心原则,保证函数在实例(instance)中共享,而数据不共享。要做到这一点,则函数需要添加到prototype上,而数据则应在构造函数内部。
(为什么函数要在实例中共享?而为什么数据不要共享?
1.函数在JS中是对象,是占用内存空间的,最好只有一份。这一点和C语系的语言不同。C语系的函数随便定义,不占内存,反正只是执行过程。
2.数据如果共享了,则在实例中数据就会互相影响,这是我们不想看到的,C++类的数据都是一个实例保存一份,所以JS中也需要做出这种效果。

1.原型链继承
这是最原始的方式,没有做一点优化。

function SuperType(){}
function SubType(){}
SubType.prototype = new SuperType();

这里使得父类的实例成为子类的原型,子类的实例则都可以访问到父类定义的函数。
然而这样是会产生问题的。根据上边所说的核心原则,应该函数共享,数据不共享,而原型链继承这种原始的继承方式会导致父类数据也变成共享的了。(思考:数据怎么成共享的了?)
而且这种继承还有一个缺点,子类无法向父类构造函数传参(向父类传参还是很有必要的,想想C++就知道)。
2.借用构造函数法

function SuperType(name){
  this.name = name;
  this.func = function(){}
}
function SubType(name){
  SuperType.call(this,name);
}
var instance = new SubType();

缺点:函数无法复用。
3.组合继承
将原型链法和借用构造函数法组合起来。采二者之长,规避二者之短。

function SuperType(name){
  this.name = name;
  this.func = function(){}
}
function SubType(name){
  SuperType.call(this,name);
}
SubType.prototype = new SuperType();
var instance = new SubType();

而JS精粹作者提出的两种方式我觉得都不好,增加记忆负担和思维负担。
感觉他本人比较喜欢奇技淫巧,换句话说就是不朴实,虽然书写的不错,但是好多东西都增加思维负担。我一直觉得编程应该是自由的,少点条条框框反而会提升更快。我比较喜欢原理性文章,却讨厌一直被人教导你应该这样做那样做,然而并没有本质上的区别和性能上的提升。

相关文章

  • 2019-03-25 继承

    js中通过原型来实现继承 组合继承:原型继承+借用构造函数继承

  • js基础之实现继承的几种方式

    js 实现继承的方式有: 原型链继承; 构造函数继承; 组合继承(原型链继承 + 构造函数继承)(最常用);(原型...

  • js继承

    js继承js 继承-简书 原型链实现集继承 上面的代码实现原型链继承最重要的son.prototype=new f...

  • js继承遇到的小问题

    这两天在看js继承方面,它不像OC那种传统的类继承。js继承方式还是挺多的。比如:原型继承、原型冒充、复制继承 原...

  • 浅析JS继承方法

    JS 实现继承的方法有:1.原型链继承2.构造函数继承3.组合继承(原型链继承 + 构造函数继承)4.原型式继承(...

  • js之继承

    文章主讲 JS 继承,包括原型链继承、构造函数继承、组合继承、寄生组合继承、原型式继承、 ES6 继承,以及 多继...

  • 前端开发必须知道的JS(一) 原型和继承(转载)

    前端开发必须知道的JS(一) 原型和继承 原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会...

  • JavaScript如何实现继承?

    JS 中的继承主要分为两种:原型继承和非原型继承,非原型继承又分为寄生方式继承、借用或伪造构造函数方式继承、组合方...

  • js实现继承的几种方式

    js实现继承有几种方式,这里我们主要探讨 原型链继承 构造继承 组合继承(原型链和构造继承组合到一块,使用原型链实...

  • JS汇总---面向对象&数组

    面向对象 js原型链的继承 静态属性怎么继承 js原型链以及特点 面向对象有哪几个特点 封装,继承,多态 对象的继...

网友评论

      本文标题:JS原型继承

      本文链接:https://www.haomeiwen.com/subject/rblrnttx.html