在javascript中,生成实例对象的传统方式是通过构造函数,例如
function Point(x,y){
this.x = x;
this.y = y;
}
Point.prototype.toString = function(){
return '('+this.x+','+this.y+')'
}
var p = new Point(1,2)
但是ES6提供了一种更简单的写法,我们可以把他看做一个语法糖,他的绝大部分功能,ES5都能实现,新的class写法只是让对象原型的写法更清晰,更像面向对面编程的语法而已,上面的代码可以修改成
class Point{
constructor(x,y){
this.x = x;
this.y = y
}
toString() {
return '('+this.x+','+this.y+')';
}
}
上面的代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字代表实例对象,也就是说,ES5的构造函数Point,对应的ES6Point类的构造方法。
Point类除了构造方法,还定义了一个toString方法,注意,定义“类”的方法的时候,前面不需要再加上function关键字了,直接把函数定义放进去就行了。另外,方法之间不需要逗号分隔,加了会报错!
ES6的类,完全可以看成构造函数的另一种写法
class Point {
//....
}
typeof Point //function
Point === Point.prototype.constructor //true
上面的代码可以看出来,类的数据类型就是函数,类的本省指向构造函数。
使用的时候,直接对类使用new命令,跟构造函数的用法完全一样
class Bar {
doStuff() {
console.log('stuff');
}
}
var b = new Bar();
b.doStuff() // "stuff"
构造函数的prototype属性,在ES6中的‘类’依旧存在,事实上,类的所有方法都定义在类的prototype上面
class Point{ constructor(){ //... } toString(){ //... } toValue(){ //... } } Point.prototype = { constructor(){}, toString(){}, toValue(){} }
在类的实例上面调用方法,其实就是调用原型上的方法!
class B {}
let b = new B();
b.constructor ===B.prototype.constructor //true
可以看出,b是B的实例,它的constructor方法就是B类原型的constructor方法
由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面,Object.assign方法可以很方便的向类添加多个方法
class Point {
constructor(){
// ...
}
}
Object.assign(Point.prototype, {
toString(){},
toValue(){}
});
所有类的内部定义的方法,都是不可枚举的