ES5和ES6在在构造函数加类型方式与实现继承的区别
【浅说】JavaScript 语言中,生成实例对象的传统方法是通过构造函数,es6的class 的出现 基本上可以替代了es5的构造函数和原型,使之代码结构上更加简洁。
1.构造函数的写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习js的程序员感到困惑。
2.ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
3.新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
ES5和ES6的不同之处
1、 系统库的引用
ES5中的引用需要先使用require导入包,成为对象,再去进行真正引用;而在ES6里,可以使用import直接实现系统库引用,不需要额外制作一个类库对象。
2、 导出及引用单个类
ES5中,要导出一个类给别的模块使用,一般通过module.exports来实现,引用时通过require方法来获取;而在ES6中,使用export default实现同样的功能,但要使用import方法来实现导入。
3、 ES5 和 ES6 继承的区别
ES5的类继承,构造函数继承和原型继承是分开的(两种不同的方式)。子类继承父类的时候,先创造子类的实例对象this,然后再将父类的属性和方法添加到this上面,然后再去继承原型链。
而ES6类继承机制完全和es5不一样,是调用super方法将父类的属性和方法加到this上面。在子类的构造函数中,只有调用super之后,才可以使用this关键字,否则会报错。这是因为子类的构建基于父类,只有super方法才能调用父类构造函数。
案例:
ES5
// 父类
// 使用构造函数+原型的方式实现创建对象和继承
// 继承一般就是: 复用父类构造函数 使用父类原型中的成员
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function() {
console.log(this.name, this.age)
}
// 子类
function Student(name, age, gender,matrimony){
// 继承父类构造函数--调用父类构造函数
// 使用上下文调用模式,改变Person构造函数中的this,
// 让this指向当前的Student构造函数中的对象
Person.call(this,name,age,matrimony) // 函数调用模式,函数中的this指向window
this.gender = gender
this.matrimony = matrimony
}
// 子类继承父类原型中的成员
Student.prototype.say = Person.prototype.say
// 创建子类对象并调用方法
let stu = new Student('ldh', 22, '男','未婚')
console.log(stu);
ES6
// 都要定义类型,实现构造函数的继承,和原型成员的继承
class Person{
// 添加构造函数--构造器:为对象初始化成员
// 名称固定:constructor
// 添加构造函数(构造器)
constructor(name,age){
this.name = name
this.age = age
}
// 添加原型中的成员:直接写函数
say(){
console.log(this.name,this.age);
}
}
// 继承语法:
// class 子类 extends 父类 {}
// extends特点:默认就会继承父类的构造器和原型中的成员
// 子类继承父类,就会拥有父类中的所有成员
class Student extends Person{
constructor(name,age,gender,matrimony){
// 调用super之后才可以去写其他代码
super(name,age)
this.gender = gender
this.matrimony = matrimony
}
}
let stu = new Student('lyf', 22, '女','未婚')
console.log(stu);
希望以上内容可以对你有所帮助!