From 283b5716508ede07b574cbe1315c6ca61cd4ba42 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 31 Aug 2018 17:51:19 +0800 Subject: [PATCH] =?UTF-8?q?docs(class):=20edit=20=E7=A7=81=E6=9C=89?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 31 +++++++++++++++++++++++++++++-- docs/reference.md | 2 ++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/class.md b/docs/class.md index 5f0aa28..9f41ec2 100644 --- a/docs/class.md +++ b/docs/class.md @@ -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`,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。 diff --git a/docs/reference.md b/docs/reference.md index 9d2330f..c1b3bff 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -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