一、class
es6加入的class其实是为了开发者方便创建类,与其他语言在写法上尽量一致,但是js原生并没有类这个东西,为了实现类的效果,可以通过js的构造器来实现,class使用new关键字生成实例,构造器也是通过new来实例化,那么可以推断class本质也是个构造器
const Class = (function(){function Constructor(name){this.name = name}Constructor.prototype.getName = function getName(){}Constructor.prototype.age = '18'Constructor.log = function log(){}Constructor.isWho = 'iswho'return Constructor})()const item = new Class('leon')
实现class语法糖,只需封装一层函数。
- 返回的Constructor就是实例的构造器,其prototype是个空白的对象这是由于Function造成的
- new后面调用的函数必须是一个构造器函数,用于构造实例,此构造器的this指向实例
- 构造器内部需要实现依照传入的参数设置实例的属性
- 定义Class时需要实现原型属性和静态属性的挂载
二、实现extends
- 继承需要满足原型的继承
- 还需要满足可调用父类构造器
//父类const Parent = (function () {function Constructor(age) {this.age = age}Constructor.prototype.getName = function () {console.log(this.name);}return Constructor})()//子类const Class = (function (_Parent = null) {if (_Parent) {Constructor.prototype = Object.create(_Parent.prototype, {constructor: {value: Constructor,enumerable: false,writable: true,configurable: true}})Constructor.__proto__ = _Parent}function Constructor(name, age) {_Parent ? _Parent.call(this, age) : thisthis.name = name}Constructor.prototype.getAge = function () {console.log(this.age);}return Constructor})(Parent)
- 实现原型继承,可以使用之前的继承写法,注意class形式的继承,会把父类设为子类的
__proto__ - 在构造函数内判断是否有父类,如果有就要调用父类的构造函数,把当前的this传入,这样才能生成父类构造器中定义的属性,这才算是真正的继承。继承不单继承原型还能实现继承父类构造器中定义的属性
- 对于原型方法和静态方法也是类似定义,注意定义的方法如果用到this需要使用function关键字定义函数,不可使用匿名函数,否则this无法指向调用对象本身
————————————————————————————————————————-[引用来源] https://juejin.im/post/6844904136161361933
