JavaScript 构造函数与 class
类与继承
- ES6之前:使用构造函数模拟类
- ES6之后:使用
class
语法糖
构造函数
用构造函数创建类
JS中的构造函数是一种特殊的函数,用于创建对象。它们是通过使用new关键字调用的函数,并且在函数内部使用this关键字来引用新创建的对象。构造函数可以包含属性和方法,这些属性和方法可以在创建对象时被调用。
1 |
|
不过,对于原型对象的构造函数的重新指向,它应该是不可枚举。因此,在这里的原型对象的重新指向,应该使用Object.defineProperty
的方式
1 |
|
规范
- 类名首字母大写
- 原型上的私有方法,默认以下划线开始
属性继承
通过call
改变this
指向的方式,实现子类继承父类的属性
1 |
|
方法继承
方法和属性是不同的继承,因为方法是复杂数据类型。需要在原型上操作,直接将父类的原型赋值给子类,同时注意改变原型的构造函数的指向
1 |
|
Son.prototype = new Father()
Son.prototype.constructor = Son
1 |
|
Son.prototype = Object.create(Father.prototype);
Son.prototype.constructor = Son;
// 或者
Son.prototype = Object.create(Father.prototype, {
constructor: {
value: Son,
enumerable: false,
writable: false,
configurable: false
}
})
1 |
|
// 创建一个Person类
class Person {
// 构造器方法
constructor(name, age){
this.name = name // 构造器中的this–类的实例对象
this.age = age
}
// 共有方法
say(){
console.log(‘I can say’)
}
run(){
console.log(‘I can run’)
}
fun1() {
console.log(‘这个方法放在了原型对象上’)
}
fun2 = ()=> {
console.log(‘这个方法放在了实例自身上’)
}
static fun3 = ()=> {
console.log(‘我前面用static进行修饰, 我是加在类本身的方法上的方法’)
}
static fun4() {
console.log(‘我前面用static进行修饰, 我是加在类本身的方法上的方法’)
}
}
// 创建一个实例化对象,必须使用 new 关键词
let person1 = new Person(“xx”, 10);
1 |
|
class Father {
constructor(arg1, arg2){
}
}
// 使用 extends 关键字,表示继承自父类
class Son extends Father {
constructor(arg1, arg2, arg3){
// 必须先调用父类的构造方法,再使用子类的构造方法
super(arg1, arg2) // 相当于调用了父类的构造函数来赋值,这样才可以使用父类的方法
this.arg3 = arg3 // 如果子类有自己的属性,则应该在super之后
}
}
关于继承中的方法
1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
2. 继承中,如果子类里面没有就去查找父类有没有这个方法,如果有,就执行父类的这个方法(遵循就近原则)
3. 但可以通过`super`主动调用父类里面的方法:`super.方法()`
## JS的构造函数和ES6的类之间的区别
JS的构造函数和ES6的类之间有几个重要的区别。以下是一些最重要的区别:
* 语法:构造函数使用函数声明的方式来定义,而类使用class关键字来定义。
* 继承:类支持更简单和更灵活的继承方式,同时也支持多重继承。构造函数也可以实现继承,但是需要使用原型链来实现。
* 可读性:类的语法更加易于阅读和理解,因为它使用了更加自然的面向对象编程方式。
* 实例化:构造函数需要使用new关键字来创建新的实例,而类可以直接调用构造函数来创建新的实例。