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:
parent
bfd962c55f
commit
283b571650
@ -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`,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user