You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
'use strict';function_possibleConstructorReturn(self,call){if(!self){thrownewReferenceError("this hasn't been initialised - super() hasn't been called");}returncall&&(typeofcall==="object"||typeofcall==="function") ? call : self;}function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}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;}function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}varParent=functionParent(name){_classCallCheck(this,Parent);this.name=name;};varChild=function(_Parent){_inherits(Child,_Parent);functionChild(name,age){_classCallCheck(this,Child);// 调用父类的 constructor(name)var_this=_possibleConstructorReturn(this,(Child.__proto__||Object.getPrototypeOf(Child)).call(this,name));_this.age=age;return_this;}returnChild;}(Parent);varchild1=newChild('kevin','18');console.log(child1);
在开始看源码之前首先要明白 class 的原理 也就是说要知道它有那些特性这里最关键的有两个地方
function
但 class 不同于其他的构造函数 它有两条原型链 子类B的__proto__
指向继承的class也就是 父类B 第二条原型链子类原型的__proto
指向于父类原型的__proto__
这种继承关系类似于寄生组合继承但又有点差异就是它在其基础上增加了一点
Object.setPrototypeOf(A, B)
这样的好处是父类的属性(静态属性) 也可以继承到子类上super
函数 要能清楚的知道 es5 中和 es6 中的继承机制是什么 前者是先创建一个子类实例对象然后去继承父类的属性和方法是 "先实例后继承" es6 是将父类属性和方法加载到一个对象上可以将其理解为 this 对象 (this 是指向的父类的)然后在将这个this 对象作为子类的实例 先继承后实例es6 中的代码
转换后的代码 不过在使用现在版本的 babel 转换的时候可能会得到更多的代码但是原理上都大差不差
参考文章:es6 class 转成 es5 后的代码
The text was updated successfully, but these errors were encountered: