JavaScript 语言中,生成实例对象的传统方法是通过构造函数,es6的class 的出现 基本上可以替代了es5的构造函数和原型,使之代码结构上更加简洁。
1.构造函数的写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习js的程序员感到困惑。
2.ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
3.新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
ES5 创建对象
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHi = function () {
console.log("hello, 我是" + this.name);
};
var p = new Person("lw", 36);
p.sayHi();
ES6 创建对象
class Person {
constructor(name, age) {
this.name = name; // 属性
this.age = age;
}
sayHi() { // 方法
console.log("hello, 我是" + this.name); // sayHi是原型对象的属性
};
}
var p = new Person("lw", 36);
p.sayHi();
constructor方法
constructor()
方法是类的默认方法,通过new
命令生成对象实例时,自动调用该方法。一个类必须有constructor()
方法,如果没有显式定义,一个空的constructor()
方法会被默认添加。 (类就是构造函数)
class Point {
}
// 等同于
class Point {
constructor() {}
}
上面代码中,定义了一个空的类Point,JavaScript 引擎会自动为它添加一个空的constructor()方法。constructor()方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
class Foo {
constructor() {
return Object.create(null);
}
}
new Foo() instanceof Foo
// false
上面代码中,
constructor()
函数返回一个全新的对象,结果导致实例对象不是Foo
类的实例。类必须使用
new
调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new
也可以执行。
class Foo {
constructor() {
return Object.create(null);
}
}
Foo()
// TypeError: Class constructor Foo cannot be invoked without 'new'
class Person {
constructor(name, age, gender) {
this.name = name
this.age = age
this.gender = gender
}
say() {
console.log(this.name);
}
}
class Student extends Person {
constructor(name, age, gender, ss) {
// super 一定要写在构造函数constructor里面,否则会语法错误
super(name, age, gender) // 就如Person.call(this,name,age,gender)
}
get m() { // get是取值函数
super.say()
}
}
let per = new Person('rose')
let stu = new Student('jack', 20, '男')
console.log(stu); // Student {name: 'jack', age: 20, gender: '男'}
per.say() // rose
stu.m // jack