@@ -38,9 +38,9 @@ class Point {
38
38
}
39
39
```
40
40
41
- 上面代码定义了一个“类”,可以看到里面有一个` constructor ` 方法,这就是构造方法,而` this ` 关键字则代表实例对象。也就是说, ES5 的构造函数` Point ` ,对应 ES6 的 ` Point ` 类的构造方法 。
41
+ 上面代码定义了一个“类”,可以看到里面有一个` constructor() ` 方法,这就是构造方法,而` this ` 关键字则代表实例对象。这种新的 Class 写法,本质上与本章开头的 ES5 的构造函数` Point ` 是一致的 。
42
42
43
- ` Point ` 类除了构造方法,还定义了一个` toString ` 方法。注意,定义“类”的方法的时候 ,前面不需要加上` function ` 这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔 ,加了会报错。
43
+ ` Point ` 类除了构造方法,还定义了一个` toString() ` 方法。注意,定义` toString() ` 方法的时候 ,前面不需要加上` function ` 这个关键字,直接把函数定义放进去了就可以了。另外,方法与方法之间不需要逗号分隔 ,加了会报错。
44
44
45
45
ES6 的类,完全可以看作构造函数的另一种写法。
46
46
@@ -64,7 +64,7 @@ class Bar {
64
64
}
65
65
}
66
66
67
- var b = new Bar ();
67
+ const b = new Bar ();
68
68
b .doStuff () // "stuff"
69
69
```
70
70
@@ -94,18 +94,20 @@ Point.prototype = {
94
94
};
95
95
```
96
96
97
- 在类的实例上面调用方法,其实就是调用原型上的方法。
97
+ 上面代码中,` constructor() ` 、` toString() ` 、` toValue() ` 这三个方法,其实都是定义在` Point.prototype ` 上面。
98
+
99
+ 因此,在类的实例上面调用方法,其实就是调用原型上的方法。
98
100
99
101
``` javascript
100
102
class B {}
101
- let b = new B ();
103
+ const b = new B ();
102
104
103
105
b .constructor === B .prototype .constructor // true
104
106
```
105
107
106
- 上面代码中,` b ` 是` B ` 类的实例,它的` constructor ` 方法就是` B ` 类原型的` constructor ` 方法。
108
+ 上面代码中,` b ` 是` B ` 类的实例,它的` constructor() ` 方法就是` B ` 类原型的` constructor() ` 方法。
107
109
108
- 由于类的方法都定义在` prototype ` 对象上面,所以类的新方法可以添加在` prototype ` 对象上面。` Object.assign ` 方法可以很方便地一次向类添加多个方法。
110
+ 由于类的方法都定义在` prototype ` 对象上面,所以类的新方法可以添加在` prototype ` 对象上面。` Object.assign() ` 方法可以很方便地一次向类添加多个方法。
109
111
110
112
``` javascript
111
113
class Point {
@@ -120,7 +122,7 @@ Object.assign(Point.prototype, {
120
122
});
121
123
```
122
124
123
- ` prototype ` 对象的` constructor ` 属性,直接指向“类”的本身,这与 ES5 的行为是一致的。
125
+ ` prototype ` 对象的` constructor() ` 属性,直接指向“类”的本身,这与 ES5 的行为是一致的。
124
126
125
127
``` javascript
126
128
Point .prototype .constructor === Point // true
@@ -145,14 +147,14 @@ Object.getOwnPropertyNames(Point.prototype)
145
147
// ["constructor","toString"]
146
148
```
147
149
148
- 上面代码中,` toString ` 方法是` Point ` 类内部定义的方法,它是不可枚举的。这一点与 ES5 的行为不一致。
150
+ 上面代码中,` toString() ` 方法是` Point ` 类内部定义的方法,它是不可枚举的。这一点与 ES5 的行为不一致。
149
151
150
152
``` javascript
151
153
var Point = function (x , y ) {
152
154
// ...
153
155
};
154
156
155
- Point .prototype .toString = function () {
157
+ Point .prototype .toString = function () {
156
158
// ...
157
159
};
158
160
@@ -162,11 +164,11 @@ Object.getOwnPropertyNames(Point.prototype)
162
164
// ["constructor","toString"]
163
165
```
164
166
165
- 上面代码采用 ES5 的写法,` toString ` 方法就是可枚举的。
167
+ 上面代码采用 ES5 的写法,` toString() ` 方法就是可枚举的。
166
168
167
169
### constructor 方法
168
170
169
- ` constructor ` 方法是类的默认方法,通过` new ` 命令生成对象实例时,自动调用该方法。一个类必须有` constructor ` 方法,如果没有显式定义,一个空的` constructor ` 方法会被默认添加。
171
+ ` constructor() ` 方法是类的默认方法,通过` new ` 命令生成对象实例时,自动调用该方法。一个类必须有` constructor() ` 方法,如果没有显式定义,一个空的` constructor() ` 方法会被默认添加。
170
172
171
173
``` javascript
172
174
class Point {
@@ -178,9 +180,9 @@ class Point {
178
180
}
179
181
```
180
182
181
- 上面代码中,定义了一个空的类` Point ` ,JavaScript 引擎会自动为它添加一个空的` constructor ` 方法。
183
+ 上面代码中,定义了一个空的类` Point ` ,JavaScript 引擎会自动为它添加一个空的` constructor() ` 方法。
182
184
183
- ` constructor ` 方法默认返回实例对象(即` this ` ),完全可以指定返回另外一个对象。
185
+ ` constructor() ` 方法默认返回实例对象(即` this ` ),完全可以指定返回另外一个对象。
184
186
185
187
``` javascript
186
188
class Foo {
@@ -193,7 +195,7 @@ new Foo() instanceof Foo
193
195
// false
194
196
```
195
197
196
- 上面代码中,` constructor ` 函数返回一个全新的对象,结果导致实例对象不是` Foo ` 类的实例。
198
+ 上面代码中,` constructor() ` 函数返回一个全新的对象,结果导致实例对象不是` Foo ` 类的实例。
197
199
198
200
类必须使用` new ` 调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用` new ` 也可以执行。
199
201
@@ -251,7 +253,7 @@ point.hasOwnProperty('toString') // false
251
253
point .__proto__ .hasOwnProperty (' toString' ) // true
252
254
```
253
255
254
- 上面代码中,` x ` 和` y ` 都是实例对象` point ` 自身的属性(因为定义在` this ` 变量上),所以` hasOwnProperty ` 方法返回` true ` ,而` toString ` 是原型对象的属性(因为定义在` Point ` 类上),所以` hasOwnProperty ` 方法返回` false ` 。这些都与 ES5 的行为保持一致。
256
+ 上面代码中,` x ` 和` y ` 都是实例对象` point ` 自身的属性(因为定义在` this ` 变量上),所以` hasOwnProperty() ` 方法返回` true ` ,而` toString() ` 是原型对象的属性(因为定义在` Point ` 类上),所以` hasOwnProperty() ` 方法返回` false ` 。这些都与 ES5 的行为保持一致。
255
257
256
258
与 ES5 一样,类的所有实例共享一个原型对象。
257
259
@@ -282,7 +284,7 @@ var p3 = new Point(4,2);
282
284
p3 .printName () // "Oops"
283
285
```
284
286
285
- 上面代码在` p1 ` 的原型上添加了一个` printName ` 方法,由于` p1 ` 的原型就是` p2 ` 的原型,因此` p2 ` 也可以调用这个方法。而且,此后新建的实例` p3 ` 也可以调用这个方法。这意味着,使用实例的` __proto__ ` 属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。
287
+ 上面代码在` p1 ` 的原型上添加了一个` printName() ` 方法,由于` p1 ` 的原型就是` p2 ` 的原型,因此` p2 ` 也可以调用这个方法。而且,此后新建的实例` p3 ` 也可以调用这个方法。这意味着,使用实例的` __proto__ ` 属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。
286
288
287
289
### 取值函数(getter)和存值函数(setter)
288
290
0 commit comments