ES6中类的实现原理是什么

  介绍

本篇文章给大家分享的是有关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中类的实现原理是什么