说到继承,或者广义上讲:一个对象可以使用另一个对象的属性或方法。实现方式有两种:apply或者call,改变这个原型继承的作用域,改变__proto__点,增加作用域链,JavaScript所有的继承实现都是围绕以上两点展开的。1.原型链继承2.构造函数继承3.组合继承4.ES6扩展继承原型链继承functionFather(){}functionSon(){}Son.prototype=newFather()缺点很明显:子类构造函数不能通过参数。子类只是复制父类的引用。父类的引用类型的属性将被所有子类继承。functionFather(){}functionSon(){Father.apply(this,arguments)}resolves参数和引用共享问题解决,但是父类方法不能共享。组合继承函数Father(){}functionSon(){Father.apply(this,arguments)}Son.prototype=newFather()实现属性分离和方法共享;es5下的完美继承方案ES6继承了我们的主角,ES6extends是对组合继承的改进。不同的是,在子类中,子类作用域和父类作用域在前。在ES5中,先声明子类的作用域,然后再将子类的作用域指向父类。在ES6中,子类的作用域首先指向父类,然后在此基础上增强了子类的作用域。这就是为什么需要在子类构造函数中显式调用super()的原因。参考babel转换后的代码:varSon=function(_Father){_inherits(Son,_Person);函数Son(){_classCallCheck(this,Son);//为了便于阅读,代码进行了简化var_this=_possibleConstructorReturn(this,Father.call(this));_this.gender="男";return_this;//返回的是父类_this的作用域}returnSon;}(Father);关于更详细的ES6Class的实现机制,可以参考我的另一篇文章:浅谈ES6CLASS的实现原理<>后记我第一次在sifou上发了一篇文章,加了个话题-Javascript五十问-其中我会讲到JavaScriptnative和ES6的内容;也算是自己在开发过程中的积累;如果有谁发现错误,希望大家多多指教,共同进步!参考文档一文看懂JS继承https://segmentfault.com/a/11...Javascript红书阮一峰ES6标准介绍
