Class类的特性(上)

ES6 的类,完全可以看作ES5构造函数的另一种写法。

class Point {
// ...
} typeof Point // "function"
Point === Point.prototype.constructor // true
上面代码表明,类的数据类型就是函数,类本身就指向构造函数。 构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。 class Point {
constructor() {
// ...
} toString() {
// ...
} toValue() {
// ...
}
} // 等同于 Point.prototype = {
constructor() {},
toString() {},
toValue() {},
}; Object.assign只拷贝当前那一层的基本数据类型
let target = {a: };
let source1 = {b: };
let source2 = {c: ,data:{ff:}};
let obj = Object.assign(target, source1, source2); console.log(obj) //{a: 123, b: 456, c: 789, data: {ff:1}}
obj.data.ff //
source2 .data.ff="fffffffff"
console.log(obj) //{a: 123, b: 456, c: 789, data: {ff:fffffffff}}
obj.data.ff //"fffffffff" 类不显式定义constructor的话,引擎会自动加。
类必须new调用,而构造函数可以直接调用。 constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。 class Foo {
constructor() {
return Object.create(null);
}
} new Foo() instanceof Foo
// false
上面代码中,constructor函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。 与 ES5 一样,实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。 //定义类
class Point { constructor(x, y) {
this.x = x;
this.y = y;
} toString() {
return '(' + this.x + ', ' + this.y + ')';
} } var point = new Point(, ); point.toString() // (2, 3) point.hasOwnProperty('x') // true
point.hasOwnProperty('y') // true
point.hasOwnProperty('toString') // false
point.__proto__.hasOwnProperty('toString') // true
上面代码中,x和y都是实例对象point自身的属性(因为定义在this变量上),所以hasOwnProperty方法返回true,而toString是原型对象的属性(因为定义在Point类上),所以hasOwnProperty方法返回false。这些都与 ES5 的行为保持一致。 由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。
name属性总是返回紧跟在class关键字后面的类名。 总结:
类中的方法能被实例继承。
类中的this指向实例。 static方法(静态方法):不能被实例调用,只能被类调用。父类中的static方法,能被子类继承。
static方法中的this指向类。 实例属性:之前一般在constructor()方法里面定义。现在直接与实例方法同级定义。(实例属性的新写法) 静态属性:static prop = ;新写法,直接在前加static。只能被类调用。 私有方法和私有属性:是只能在类的内部访问的方法和属性,外部不能访问。(作用域影响)
私有属性和私有方法:目前是提案,是前面加# 如:#a。

05-16 22:25