1.在
es6
中对继承有了更友好的方式。在下面的继承中那到底在extends
的时候作了什么,super()
又是表明什么意思。es6
class People{ constructor(name, age) { this.name = name; this.age = age;} say(){ alert("hello")} static see(){ alert("how are you")}} class lily extends People{ constructor(){ super()} goodbye(){alert("goodbye")}}
2.解析
extends
和super()
segmentfault
①在前面的文章中有说起class
声明类的原理:https://segmentfault.com/a/11...函数
②lily
是People
的子类,首先lily
也是一个类;extends
的过程当中建立了一个自执行函数,并将父类传进去,继承父类以后再返回该子类。lily.__proto__
指的是当前对象所属类的原型,也就是Object.getPrototypeOf(lily)
.this
var lily = function(_People) { inherits(lily, _People); //第一步,继承父类原型 function lily() { //第二步,继承父类对象属性 return _possibleConstructorReturn(this, (lily.__proto__ || Object.getPrototypeOf(lily)).call(this));} createClass(lily, [{ //第三步,建立子类本身的方法 key: "goodbye", value: function goodbye() { alert("goodbye");}}]); return lily; }(People);
③继承的过程:通常继承分两步,call
继承+原型的继承 (分别继承父类对象属行和原型属性)prototype
第一步:继承父类的原型,经过Object.create
,第一个参数是建立一个对象的原型,定义原型上的属性constructor
指向subclass
;把父类的原型方法继承给子类原型;code
function inherits(subClass, superClass) { subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
第二步:call
继承,就是super()
的处理过程,super()
的实质就是People.call(this)
;把父类的对象方法继承给子类对象;这也是为何在es6
的继承时必需要加上super()
,由于不加的话没法继承到父类的对象属性。对象
function _possibleConstructorReturn(self, call) { //call指的是Object.getPrototypeOf(lily)).call(this),也就是People.call(this) return call && (typeof call === "object" || typeof call === "function") ? call : self;
第三部:建立子类本身的方法。 能够参考class里面的实现过程。继承
总的来讲
es6
的extends
的实质和之前的继承方式是一致 的,可是有了更好的,更清晰的表现形式。get