46 class语法
46.1 class语法详解
1.组合模式用class
1.class里的所有方法定义在类的prototype属性上面
2.ES5构造函数Point对应ES6的Point类的构造方法
class Point{
constructor(x,y){
this.x=x;
this.y=y;
}
toString(){
console.log(this.x+this.y);
}
}
let point=new Point(1,2);
toString in point //true
语法糖:计算机语言中添加某种语法但是面对语言的功能没有影响,更方便程序员的使用。
2.在class里添加新函数
Point.prototype.sayx=function(){
console.log(this.x);
}
2.assign:target,source 返回target
class Point {
}
Object.assign(Point, {
constructor(x, y) {
//不先在class里写constructor,则默认不要,这里的constructor没有用,但是不报错
this.x = x;
this.y = y;
},
toString() {
console.log(this.x + this.y);
}
})
let point = new Point(1, 2);
"constructor" in Point //true,但是其实是不可枚举的
方法 in 构造函数 //检测可枚举属性
实例 instanceof 构造函数 //检测构造函数是谁
3.缺点:在class里定义的所有方法,看上去好像不可枚举的,
Object.keys(Point.prototype)
["sayx"]
无论是可不可遍历,reflect.keys
对象属性遍历
ES6一共有五种方法可以遍历对象属性
1.for…in
2.Object.keys(obj)
在12两个属性里面,在谷歌浏览器中对class的遍历得出的属性是不一样的
3.Object.getOwnPropertyNames(obj)
4.Object.getOwnPropertySymbols(obj)
5.Reflect.ownKeys(obj)
2.constructor
1.寄生构造模式不能用在class里,否则会创造最干净的class
class foo{
constructor(){
return Object.create(null);
}
}
foo();//VM1064:1 Uncaught TypeError: Class constructor foo cannot be invoked without 'new'
// at <anonymous>:1:1
2.原来class里不写constructor,在Object.assign里用constructor则没有用。
3.getter和setter
4.属性名 类名表达式实现
类的属性名可以采用表达式