介绍
本篇文章给大家分享的是有关ES6中类的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
实现类的代码如下:
功能人(名字){ this.name=名称; } Person.prototype。showName=function () { 返回的名字是:$ {this.name} '; }; 函数的学生(姓名、技能){ 的人。调用(这名字);//继承属性 这一点。技能=技能; } 学生。原型=新人();//继承方法
类父母{ 构造函数(姓名、年龄){ this.name=名称; 这一点。年龄=年龄; } speakSomething () { console.log(“我可以chinese"讲话); } }
经过巴别塔转码之后
函数_classCallCheck(实例构造函数){ 如果(!(实例实例构造器)){ 把新的TypeError(“不能调用一个类作为function"); } } var父母=function () { 函数父(姓名、年龄){ _classCallCheck(父); this.name=名称; 这一点。年龄=年龄; } _createClass(父,{ 关键:“speakSomething", 价值:函数speakSomething () { console.log(“我可以chinese"讲话); } })); 回报父母; }();
可以看到ES6类的底层还是通过构造函数去创建的。
通过ES6创建的类,是不允许你直接调用的,在ES5中构造函数是可以直接运行的,比如父()。但是在ES6就不行。我们可以看到转码的构造函数中有_classCallCheck(这个,父)语句,这句话是防止你通过构造函数直接运行的。你直接在ES6运行父(),这是不允许的,ES6中抛出父母类构造函数不能调用没有& # 39;新# 39;错误。转码后的会抛出不能调用一个类作为一个函数。能够规范化类的使用方式。
转码中_createClass方法,它调用Object.defineProperty方法去给新创建的父母添加各种属性.defineProperties (Constructor.prototype protoProps)是给原型添加属性。如果你有静态属性,会直接添加到构造函数defineProperties(构造函数,staticProps)上。
我们给父母添加静态属性,原型属性,内部属性。
类父母{ 静态高=12 构造函数(姓名、年龄){ this.name=名称; 这一点。年龄=年龄; } speakSomething () { console.log(“我可以chinese"讲话); } } Parent.prototype。颜色=& # 39;黄色# 39;//定义子类,继承父类 类子扩展父{ 静态宽度=18 构造函数(姓名、年龄){ 超级(姓名、年龄); } 编码(){ console.log(“我可以代码JS"); } }
经过巴别塔转码之后
“使用strict"; var _createClass=function () { 函数defineProperties(目标、道具){ (var=0;我& lt;props.length;我+ +){ 变量描述符=道具(我); 描述符。可列举的=描述符。可列举的| |假; 描述符。可配置=true; 如果(“value"在描述符)描述符。可写=true; Object.defineProperty(目标,描述符。键,描述符); } } 返回函数(构造函数,protoProps staticProps) { 如果(protoProps) defineProperties(构造函数。原型,protoProps); 如果staticProps defineProperties(构造函数,staticProps); 构造函数返回; }; }(); 函数_possibleConstructorReturn(自我,调用){ 如果自我(!){ 把新的ReferenceError(“这还# 39;t被初始化- super()没有# 39;t called"); } 回电话,,(typeof叫===皁bject"| | typeof叫===癴unction"), # 63;电话:自我; } 函数_inherits(父类,子类){ 如果(typeof超类!==癴unction",,超类!==null) { 把新的TypeError(“超级表达式必须是零或一个函数,而不是“+ typeof超类); } 子类。原型=对象。创建(超类,,超类。原型,{ 构造函数:{ 价值:子类, 可列举的:假的, 可写:没错, 可配置:真 } }); 如果超类对象。setPrototypeOf, # 63;对象。setPrototypeOf(子类父类):子类。__proto__=超类; } 函数_classCallCheck(实例,构造函数){ 如果(!(实例实例构造器)){ 把新的TypeError(“不能调用一个类作为function"); } } var父母=function () { 函数父(姓名、年龄){ _classCallCheck(父); this.name=名称; 这一点。年龄=年龄; } _createClass(父,{ 关键:“speakSomething", 价值:函数speakSomething () { console.log(“我可以chinese"讲话); } })); 回报父母; }(); 的父母。身高=12; Parent.prototype。颜色=& # 39;黄色# 39;;//定义子类,继承父类 var的孩子=函数(_Parent) { _inherits(孩子,_Parent); 函数的孩子(姓名、年龄){ _classCallCheck(孩子); 返回_possibleConstructorReturn(这一点,孩子。__proto__ | | Object.getPrototypeOf(孩子))。调用(姓名,年龄)); } _createClass(孩子,[{ 关键:“coding", 价值:函数编码(){ console.log(“我可以代码JS"); } })); 返回的孩子; }(父); 的孩子。宽度=18;ES6中类的实现原理是什么