一、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) : this
this.name = name
}
Constructor.prototype.getAge = function () {
console.log(this.age);
}
return Constructor
})(Parent)
- 实现原型继承,可以使用之前的继承写法,注意class形式的继承,会把父类设为子类的
__proto__
- 在构造函数内判断是否有父类,如果有就要调用父类的构造函数,把当前的this传入,这样才能生成父类构造器中定义的属性,这才算是真正的继承。继承不单继承原型还能实现继承父类构造器中定义的属性
- 对于原型方法和静态方法也是类似定义,注意定义的方法如果用到this需要使用function关键字定义函数,不可使用匿名函数,否则this无法指向调用对象本身
————————————————————————————————————————-[引用来源] https://juejin.im/post/6844904136161361933