当前位置: 首页 > 后端技术 > Node.js

javascript继承---多重继承方式解析(ES5)

时间:2023-04-04 00:45:58 Node.js

Javascript继承前言JavaScript作为一门轻量级的脚本语言,在ES6和node.js之后将其推向了一个新的高度。ES5的语法糖,理解它的继承实现还是要从javascript的原生实现入手。ES6提供了更简洁固定的类声明方式。有兴趣的可以看看阮一峰对ES6的介绍。原文链接es6阮一峰http://es6.ruanyifeng.com不同的开发者对javascript继承有不同的理解。我觉得主要可以分为四种-原型链继承-对象模拟继承(构造函数继承,但我不喜欢这个名字)-组合继承-寄生组合继承对于继承,可以预先声明一个Animal,然后讨论不同的继承方法。让Animal=(function(){functionAnimal(name){this.name=name||'Animal';this.sleep=function(){console.log(this.name+'Sleeping!');}}Animal.prototype.eat=function(food){console.log(this.name+'Eating:'+food);}returnAnimal;})()原型链继承letCat=(function(){functionCat(){}Cat.prototype=newAnimal();Cat.prototype.name='cat';returnCat;})()原型链是javascript典型的继承方式。这种继承方式最大的特点就是共享。所有实例共享原型对象中的所有属性和方法。共享是它最大的优势,也是它最大的劣势。我们的不同需求,比如在大多数情况下,我们往往需要一些属性对子类是唯一的,一些读取属性的方法需要共享。另外,这种继承不能给父类传递参数。无法实现多个继承对象模拟继承letCat=(function(){functionCat(name){Animal.call(this,name);}returnCat;})()callorapplymethod继承,这种继承的最大特点恰恰与原型链继承相反。它不能继承原型属性/方法——非共享的(子类有自己的副本)。这也是它的优势,也是它的劣势。另外,解决了原型链继承不能给父类传递参数的缺点,并且可以实现一定意义上的多重继承——(注意这个多重继承要加引号)组合继承让Cat=(function(){functionCat(name){Animal.call(this,name);}Cat.prototype=newAnimal();Cat.prototype.constructor=Cat;returnCat;})()组合继承是更好的继承,是原型链继承和对象模拟继承这两种组合合理的利用了这两种组合的特性(特性不是优点^_^),不只是子类的实例,也是父类的一个实例,但是有一个缺点就是调用了两次父类的构造函数,生成了实例的两份副本(子类实例屏蔽了子类原型上的那个)造成内存浪费。这也是最常用的寄生组合继承letCat=(function(){functionCat(name){Animal.call(this,name);}(function(sub,sup){varSuper=function(){};super.prototype=sup.prototype;sub.prototype=newSuper();sub.prototype.constructor=sub})(Cat,Animal)returnCat;})()寄生组合继承是组合继承的升华,它我认为是完美继承way,改进后的组合继承了内存浪费的问题^_^