@@ -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
12171173class 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