js继承和基础继承小结

前两天学习JS继承的时候觉得有点绕,子承父 父承子的一通,后来搜到一篇阮一峰大神的继承方式的博客学习了一下,现整理了一下主要的五种继承方式。

父构造器Person,子构造器Man,Man是子构造器new出来的对象,"只能继承父构造器中的属性" 代表继承属性和方法.

第一种叫属性继承:
此种继承方式只能继承父构造器中的属性,不能继承父构造器原型上的属性. Person,.apply(this, arguments)也可用Person.call(this)替换.Man对象有两个层级,第一级存放着自有属性以及父构造器中的属性,第二级存放着自己函数原型上的属性(Man.prototype)

第二种叫原型继承:

由于Person对象中,不变的属性都可以直接写入Person.prototype.所以我们可以让Man()跳过Person(),直接继承Person.prototype.这样做的优点是效率比较高,比较省内存。缺点是 Man.prototype和Person.prototype现在指向了同一个对象,那么任何对Man.prototype的修改,都会反映到Person.prototype。

第三种原型链继承:

如果Man的prototype对象,指向一个Person的实例,那么所有Man的实例,就能继承Person了.它相当于完全删除了prototype 对象原先的值,然后赋予一个新值. 缺点是少了contructor ,原型对象的指向也发生改变 而且还会无缘无故多了好多东西

第四种原型拷贝继承:

简单说,如果把父对象的所有属性和方法,拷贝进子对象,不也能够实现继承吗? 首先,还是把Person的所有不变属性,都放到它的prototype对象上。遍历prototype里面的属性把Person里面的属性方法拷贝给Man.

第五种寄生继承:

首先我们先用一个空的对象,先把Person.prototype的属性传给这个空对象,fn是空对象,所以几乎不占内存。这时,修改Man的prototype对象,就不会影响到Person的prototype对象了.

OK,以上就是小编对继承的一些理解了,有些粗线希望能对大家有些帮助

猜你喜欢

转载自www.cnblogs.com/snails64/p/9051484.html