Skip to content

Commit 1fa35d5

Browse files
committed
docs(class): 调整”类的私有属性“一节的位置
1 parent b08cb13 commit 1fa35d5

File tree

1 file changed

+48
-48
lines changed

1 file changed

+48
-48
lines changed

docs/class.md

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -419,50 +419,6 @@ export default class myClass{
419419

420420
上面代码中,`bar``snaf`都是`Symbol`值,导致第三方无法获取到它们,因此达到了私有方法和私有属性的效果。
421421

422-
### 私有属性
423-
424-
目前,有一个[提案](https://github.com/tc39/proposal-private-fields),为`class`加了私有属性。方法是在属性名之前,使用`#`表示。
425-
426-
```javascript
427-
class Point {
428-
#x;
429-
430-
constructor(x = 0) {
431-
#x = +x;
432-
}
433-
434-
get x() { return #x }
435-
set x(value) { #x = +value }
436-
}
437-
```
438-
439-
上面代码中,`#x`就表示私有属性`x`,在`Point`类之外是读取不到这个属性的。还可以看到,私有属性与实例的属性是可以同名的(比如,`#x``get x()`)。
440-
441-
私有属性可以指定初始值,在构造函数执行时进行初始化。
442-
443-
```javascript
444-
class Point {
445-
#x = 0;
446-
constructor() {
447-
#x; // 0
448-
}
449-
}
450-
```
451-
452-
之所以要引入一个新的前缀`#`表示私有属性,而没有采用`private`关键字,是因为 JavaScript 是一门动态语言,使用独立的符号似乎是唯一的可靠方法,能够准确地区分一种属性是私有属性。另外,Ruby 语言使用`@`表示私有属性,ES6 没有用这个符号而使用`#`,是因为`@`已经被留给了 Decorator。
453-
454-
该提案只规定了私有属性的写法。但是,很自然地,它也可以用来写私有方法。
455-
456-
```javascript
457-
class Foo {
458-
#a;
459-
#b;
460-
#sum() { return #a + #b; }
461-
printSum() { console.log(#sum()); }
462-
constructor(a, b) { #a = a; #b = b; }
463-
}
464-
```
465-
466422
### this的指向
467423

468424
类的方法内部如果含有`this`,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。
@@ -1209,9 +1165,9 @@ var descriptor = Object.getOwnPropertyDescriptor(
12091165
12101166
上面代码中,存值函数和取值函数是定义在`html`属性的描述对象上面,这与ES5完全一致。
12111167
1212-
## Class的Generator方法
1168+
## Class 的 Generator 方法
12131169
1214-
如果某个方法之前加上星号(`*`),就表示该方法是一个Generator函数
1170+
如果某个方法之前加上星号(`*`),就表示该方法是一个 Generator 函数
12151171
12161172
```javascript
12171173
class Foo {
@@ -1232,9 +1188,9 @@ for (let x of new Foo('hello', 'world')) {
12321188
// world
12331189
```
12341190
1235-
上面代码中,Foo类的Symbol.iterator方法前有一个星号,表示该方法是一个Generator函数。Symbol.iterator方法返回一个Foo类的默认遍历器,for...of循环会自动调用这个遍历器
1191+
上面代码中,`Foo`类的`Symbol.iterator`方法前有一个星号,表示该方法是一个 Generator 函数。`Symbol.iterator`方法返回一个`Foo`类的默认遍历器,`for...of`循环会自动调用这个遍历器
12361192
1237-
## Class的静态方法
1193+
## Class 的静态方法
12381194
12391195
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上`static`关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
12401196
@@ -1409,6 +1365,50 @@ class Foo {
14091365
14101366
上面代码中,老写法的静态属性定义在类的外部。整个类生成以后,再生成静态属性。这样让人很容易忽略这个静态属性,也不符合相关代码应该放在一起的代码组织原则。另外,新写法是显式声明(declarative),而不是赋值处理,语义更好。
14111367
1368+
## 类的私有属性
1369+
1370+
目前,有一个[提案](https://github.com/tc39/proposal-private-fields),为`class`加了私有属性。方法是在属性名之前,使用`#`表示。
1371+
1372+
```javascript
1373+
class Point {
1374+
#x;
1375+
1376+
constructor(x = 0) {
1377+
#x = +x;
1378+
}
1379+
1380+
get x() { return #x }
1381+
set x(value) { #x = +value }
1382+
}
1383+
```
1384+
1385+
上面代码中,`#x`就表示私有属性`x`,在`Point`类之外是读取不到这个属性的。还可以看到,私有属性与实例的属性是可以同名的(比如,`#x``get x()`)。
1386+
1387+
私有属性可以指定初始值,在构造函数执行时进行初始化。
1388+
1389+
```javascript
1390+
class Point {
1391+
#x = 0;
1392+
constructor() {
1393+
#x; // 0
1394+
}
1395+
}
1396+
```
1397+
1398+
之所以要引入一个新的前缀`#`表示私有属性,而没有采用`private`关键字,是因为 JavaScript 是一门动态语言,使用独立的符号似乎是唯一的可靠方法,能够准确地区分一种属性是私有属性。另外,Ruby 语言使用`@`表示私有属性,ES6 没有用这个符号而使用`#`,是因为`@`已经被留给了 Decorator。
1399+
1400+
该提案只规定了私有属性的写法。但是,很自然地,它也可以用来写私有方法。
1401+
1402+
```javascript
1403+
class Foo {
1404+
#a;
1405+
#b;
1406+
#sum() { return #a + #b; }
1407+
printSum() { console.log(#sum()); }
1408+
constructor(a, b) { #a = a; #b = b; }
1409+
}
1410+
```
1411+
14121412
## new.target属性
14131413
14141414
`new`是从构造函数生成实例的命令。ES6为`new`命令引入了一个`new.target`属性,(在构造函数中)返回`new`命令作用于的那个构造函数。如果构造函数不是通过`new`命令调用的,`new.target`会返回`undefined`,因此这个属性可以用来确定构造函数是怎么调用的。

0 commit comments

Comments
 (0)