Skip to content

Commit 3459393

Browse files
committed
docs(class): edit class intro
1 parent 9985f6b commit 3459393

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

docs/class.md

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ class Point {
3838
}
3939
```
4040

41-
上面代码定义了一个“类”,可以看到里面有一个`constructor`方法,这就是构造方法,而`this`关键字则代表实例对象。也就是说,ES5 的构造函数`Point`,对应 ES6 的`Point`类的构造方法
41+
上面代码定义了一个“类”,可以看到里面有一个`constructor()`方法,这就是构造方法,而`this`关键字则代表实例对象。这种新的 Class 写法,本质上与本章开头的 ES5 的构造函数`Point`是一致的
4242

43-
`Point`类除了构造方法,还定义了一个`toString`方法。注意,定义“类”的方法的时候,前面不需要加上`function`这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
43+
`Point`类除了构造方法,还定义了一个`toString()`方法。注意,定义`toString()`方法的时候,前面不需要加上`function`这个关键字,直接把函数定义放进去了就可以了。另外,方法与方法之间不需要逗号分隔,加了会报错。
4444

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

@@ -64,7 +64,7 @@ class Bar {
6464
}
6565
}
6666

67-
var b = new Bar();
67+
const b = new Bar();
6868
b.doStuff() // "stuff"
6969
```
7070

@@ -94,18 +94,20 @@ Point.prototype = {
9494
};
9595
```
9696

97-
在类的实例上面调用方法,其实就是调用原型上的方法。
97+
上面代码中,`constructor()``toString()``toValue()`这三个方法,其实都是定义在`Point.prototype`上面。
98+
99+
因此,在类的实例上面调用方法,其实就是调用原型上的方法。
98100

99101
```javascript
100102
class B {}
101-
let b = new B();
103+
const b = new B();
102104

103105
b.constructor === B.prototype.constructor // true
104106
```
105107

106-
上面代码中,`b``B`类的实例,它的`constructor`方法就是`B`类原型的`constructor`方法。
108+
上面代码中,`b``B`类的实例,它的`constructor()`方法就是`B`类原型的`constructor()`方法。
107109

108-
由于类的方法都定义在`prototype`对象上面,所以类的新方法可以添加在`prototype`对象上面。`Object.assign`方法可以很方便地一次向类添加多个方法。
110+
由于类的方法都定义在`prototype`对象上面,所以类的新方法可以添加在`prototype`对象上面。`Object.assign()`方法可以很方便地一次向类添加多个方法。
109111

110112
```javascript
111113
class Point {
@@ -120,7 +122,7 @@ Object.assign(Point.prototype, {
120122
});
121123
```
122124

123-
`prototype`对象的`constructor`属性,直接指向“类”的本身,这与 ES5 的行为是一致的。
125+
`prototype`对象的`constructor()`属性,直接指向“类”的本身,这与 ES5 的行为是一致的。
124126

125127
```javascript
126128
Point.prototype.constructor === Point // true
@@ -145,14 +147,14 @@ Object.getOwnPropertyNames(Point.prototype)
145147
// ["constructor","toString"]
146148
```
147149

148-
上面代码中,`toString`方法是`Point`类内部定义的方法,它是不可枚举的。这一点与 ES5 的行为不一致。
150+
上面代码中,`toString()`方法是`Point`类内部定义的方法,它是不可枚举的。这一点与 ES5 的行为不一致。
149151

150152
```javascript
151153
var Point = function (x, y) {
152154
// ...
153155
};
154156

155-
Point.prototype.toString = function() {
157+
Point.prototype.toString = function () {
156158
// ...
157159
};
158160

@@ -162,11 +164,11 @@ Object.getOwnPropertyNames(Point.prototype)
162164
// ["constructor","toString"]
163165
```
164166

165-
上面代码采用 ES5 的写法,`toString`方法就是可枚举的。
167+
上面代码采用 ES5 的写法,`toString()`方法就是可枚举的。
166168

167169
### constructor 方法
168170

169-
`constructor`方法是类的默认方法,通过`new`命令生成对象实例时,自动调用该方法。一个类必须有`constructor`方法,如果没有显式定义,一个空的`constructor`方法会被默认添加。
171+
`constructor()`方法是类的默认方法,通过`new`命令生成对象实例时,自动调用该方法。一个类必须有`constructor()`方法,如果没有显式定义,一个空的`constructor()`方法会被默认添加。
170172

171173
```javascript
172174
class Point {
@@ -178,9 +180,9 @@ class Point {
178180
}
179181
```
180182

181-
上面代码中,定义了一个空的类`Point`,JavaScript 引擎会自动为它添加一个空的`constructor`方法。
183+
上面代码中,定义了一个空的类`Point`,JavaScript 引擎会自动为它添加一个空的`constructor()`方法。
182184

183-
`constructor`方法默认返回实例对象(即`this`),完全可以指定返回另外一个对象。
185+
`constructor()`方法默认返回实例对象(即`this`),完全可以指定返回另外一个对象。
184186

185187
```javascript
186188
class Foo {
@@ -193,7 +195,7 @@ new Foo() instanceof Foo
193195
// false
194196
```
195197

196-
上面代码中,`constructor`函数返回一个全新的对象,结果导致实例对象不是`Foo`类的实例。
198+
上面代码中,`constructor()`函数返回一个全新的对象,结果导致实例对象不是`Foo`类的实例。
197199

198200
类必须使用`new`调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用`new`也可以执行。
199201

@@ -251,7 +253,7 @@ point.hasOwnProperty('toString') // false
251253
point.__proto__.hasOwnProperty('toString') // true
252254
```
253255

254-
上面代码中,`x``y`都是实例对象`point`自身的属性(因为定义在`this`变量上),所以`hasOwnProperty`方法返回`true`,而`toString`是原型对象的属性(因为定义在`Point`类上),所以`hasOwnProperty`方法返回`false`。这些都与 ES5 的行为保持一致。
256+
上面代码中,`x``y`都是实例对象`point`自身的属性(因为定义在`this`变量上),所以`hasOwnProperty()`方法返回`true`,而`toString()`是原型对象的属性(因为定义在`Point`类上),所以`hasOwnProperty()`方法返回`false`。这些都与 ES5 的行为保持一致。
255257

256258
与 ES5 一样,类的所有实例共享一个原型对象。
257259

@@ -282,7 +284,7 @@ var p3 = new Point(4,2);
282284
p3.printName() // "Oops"
283285
```
284286

285-
上面代码在`p1`的原型上添加了一个`printName`方法,由于`p1`的原型就是`p2`的原型,因此`p2`也可以调用这个方法。而且,此后新建的实例`p3`也可以调用这个方法。这意味着,使用实例的`__proto__`属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。
287+
上面代码在`p1`的原型上添加了一个`printName()`方法,由于`p1`的原型就是`p2`的原型,因此`p2`也可以调用这个方法。而且,此后新建的实例`p3`也可以调用这个方法。这意味着,使用实例的`__proto__`属性改写原型,必须相当谨慎,不推荐使用,因为这会改变“类”的原始定义,影响到所有实例。
286288

287289
### 取值函数(getter)和存值函数(setter)
288290

0 commit comments

Comments
 (0)