File tree Expand file tree Collapse file tree 1 file changed +45
-1
lines changed Expand file tree Collapse file tree 1 file changed +45
-1
lines changed Original file line number Diff line number Diff line change @@ -354,7 +354,7 @@ person.sayName(); // "张三"
354354
355355### 私有方法
356356
357- 私有方法是常见需求,但ES6不提供 ,只能通过变通方法模拟实现。
357+ 私有方法是常见需求,但 ES6 不提供 ,只能通过变通方法模拟实现。
358358
359359一种做法是在命名上加以区别。
360360
@@ -419,6 +419,50 @@ 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+
422466### this的指向
423467
424468类的方法内部如果含有` this ` ,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。
You can’t perform that action at this time.
0 commit comments