class
- 生成类的实例对象的写法,与 ES5 完全一样,也是使用new命令
1 | class Point { |
- 实例的属性除非显式定义在其本身(即定义在this对象上), 否则都是定义在原型上(即定义在class上)。
1 | //定义类 |
避免对环境产生依赖,生产环境中,我们可以使用
Object.getPrototypeOf
方法来获取实例对象的原型,然后再来为原型添加方法/属性。
1 | var p1 = new Point(2,3); |
由于p1的原型就是p2的原型,因此p2也可以调用这个方法。 而且,此后新建的实例p3也可以调用这个方法。这意味着,使用实例的__proto__
属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。
constructor
- constructor方法是类的默认方法, ,自动调用该方法。
一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
相当于es5 new Vue
1 | class Point { |
- constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
1 | class Foo { |
,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
表达式定义
1 | const MyClass = class Me { |
- 采用 Class 表达式,可以写出立即执行的 Class。
1 | let person = new class { |
- 不存在变量提升 (hoist),必须保证子类在父类之后定义 ,这一点与 ES5 完全不同。
1
2new Foo(); // ReferenceError
class Foo {}
继承类1
2
3
4
5
6{
let Foo = class {};
class Bar extends Foo {
//Bar继承Foo
}
}
私有方法
私有方法是常见需求,但 ES6 不提供,只能通过变通方法模拟实现。
有三种方法可模拟
1 | //第一种 |
私有属性的提案
方法是在属性名之前,使用#表示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Point {
#x=0;// 私有属性可以指定初始值,在构造函数执行时进行初始化。
constructor(x = 0) {
#x = +x; // 写成 this.#x 亦可
}
get #x() { return #x }
set #x(value) { #x = +value }
#sum() { return #a + #b; } //私有方法
// #x是一个私有属性,它的读写都通过get #x()和set #x()来完成。 #x和x是两个不同的属性
}
//JavaScript 是一门动态语言,没有类型声明,使用独立的符号似乎是唯一的比较方便可靠的方法,能够准确地区分一种属性是否为私有属性。@已经留给了 Decorator。私有属性不限于从this引用,类的实例也可以引用私有属性
1
2
3
4
5
6
7
8
9class Foo {
#privateValue = 42;
static getPrivateValue(foo) {
return foo.#privateValue;
}
}
Foo.getPrivateValue(new Foo()); // 42
console.log(Foo.#privateValue) // 报错
class 的取值函数(getter)和存值函数(setter)
1 | class MyClass { |