1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00

docs(class): edit 私有属性

This commit is contained in:
ruanyf 2018-08-31 17:51:19 +08:00
parent bfd962c55f
commit 283b571650
2 changed files with 31 additions and 2 deletions

View File

@ -445,7 +445,7 @@ export default class myClass{
### 私有属性的提案
与私有方法一样ES6 不支持私有属性。目前,有一个[提案](https://github.com/tc39/proposal-private-methods),为`class`加了私有属性。方法是在属性名之前,使用`#`表示。
目前,有一个[提案](https://github.com/tc39/proposal-private-methods),为`class`加了私有属性。方法是在属性名之前,使用`#`表示。
```javascript
class Point {
@ -473,7 +473,7 @@ class Point {
}
```
之所以要引入一个新的前缀`#`表示私有属性,而没有采用`private`关键字,是因为 JavaScript 是一门动态语言使用独立的符号似乎是唯一的可靠方法能够准确地区分一种属性是否为私有属性。另外Ruby 语言使用`@`表示私有属性ES6 没有用这个符号而使用`#`,是因为`@`已经被留给了 Decorator。
之所以要引入一个新的前缀`#`表示私有属性,而没有采用`private`关键字,是因为 JavaScript 是一门动态语言,没有类型声明,使用独立的符号似乎是唯一的比较方便可靠方法能够准确地区分一种属性是否为私有属性。另外Ruby 语言使用`@`表示私有属性ES6 没有用这个符号而使用`#`,是因为`@`已经被留给了 Decorator。
这种写法不仅可以写私有属性,还可以用来写私有方法。
@ -509,6 +509,33 @@ class Counter {
上面代码中,`#x`是一个私有属性,它的读写都通过`get #x()``set #x()`来完成。
私有属性不限于从`this`引用,类的实例也可以引用私有属性。
```javascript
class Foo {
#privateValue = 42;
static getPrivateValue(foo) {
return foo.#privateValue;
}
}
Foo.getPrivateValue(new Foo()); // 42
```
上面代码允许从实例`foo`上面引用私有属性。
但是,直接从实例上引用私有属性是不可以的,只能在类的定义中引用。
```javascript
class Foo {
#bar;
}
let foo = new Foo();
foo.#bar; // 报错
```
上面代码直接从实例引用私有属性,导致报错。
## this 的指向
类的方法内部如果含有`this`,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。

View File

@ -198,6 +198,8 @@
- Axel Rauschmayer, [Classes in ECMAScript 6 (final semantics)](http://www.2ality.com/2015/02/es6-classes-final.html): Class 语法的详细介绍和设计思想分析
- Eric Faust, [ES6 In Depth: Subclassing](https://hacks.mozilla.org/2015/08/es6-in-depth-subclassing/): Class 语法的深入介绍
- Nicolás Bevacqua, [Binding Methods to Class Instance Objects](https://ponyfoo.com/articles/binding-methods-to-class-instance-objects): 如何绑定类的实例中的 this
- Jamie Kyle, [JavaScript's new #private class fields](https://jamie.build/javascripts-new-private-class-fields.html):私有属性的介绍。
## Decorator