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
|
```javascript
|
||||||
class Point {
|
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()`来完成。
|
上面代码中,`#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 的指向
|
||||||
|
|
||||||
类的方法内部如果含有`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 语法的详细介绍和设计思想分析
|
- 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 语法的深入介绍
|
- 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
|
- 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
|
## Decorator
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user