From 453c75d5569131fce201fba3fd1849c338ae117e Mon Sep 17 00:00:00 2001 From: allo Date: Wed, 12 Jan 2022 09:32:39 +0800 Subject: mv to .md for javascript.private_class_fields --- .../classes/private_class_fields/index.html | 199 --------------------- .../classes/private_class_fields/index.md | 199 +++++++++++++++++++++ 2 files changed, 199 insertions(+), 199 deletions(-) delete mode 100644 files/zh-cn/web/javascript/reference/classes/private_class_fields/index.html create mode 100644 files/zh-cn/web/javascript/reference/classes/private_class_fields/index.md diff --git a/files/zh-cn/web/javascript/reference/classes/private_class_fields/index.html b/files/zh-cn/web/javascript/reference/classes/private_class_fields/index.html deleted file mode 100644 index 70803df8a1..0000000000 --- a/files/zh-cn/web/javascript/reference/classes/private_class_fields/index.html +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: 类私有域 -slug: Web/JavaScript/Reference/Classes/Private_class_fields -tags: - - JavaScript - - 类 - - 语言特性 -translation_of: Web/JavaScript/Reference/Classes/Private_class_fields ---- -
{{JsSidebar("Classes")}}
- -

类属性在默认情况下是公共的,可以被外部类检测或修改。在ES2020 实验草案 中,增加了定义私有类字段的能力,写法是使用一个#作为前缀。

- -

语法

- -
class ClassWithPrivateField {
-  #privateField
-}
-
-class ClassWithPrivateMethod {
-  #privateMethod() {
-    return 'hello world'
- }
-}
-
-class ClassWithPrivateStaticField {
-  static #PRIVATE_STATIC_FIELD
-}
-
- -

 例子

- -

私有静态字段

- -

私有字段可以被类的构造方法(constructor)从内部声明。

- -

静态变量只能被静态方法调用的限制仍然成立。

- -
class ClassWithPrivateStaticField {
-  static #PRIVATE_STATIC_FIELD
-
-  static publicStaticMethod() {
-    ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42
-    return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD
-  }
-}
-
-assert(ClassWithPrivateStaticField.publicStaticMethod() === 42)
- -

在类评估时,私有静态字段被添加到类构造函数中。

- -

私有静态字段有一个来源限制, 只有定义该私有静态字段的类能访问该字段。

- -

这可能会导致:当使用this时出现意想不到的行为。

- -
class BaseClassWithPrivateStaticField {
-  static #PRIVATE_STATIC_FIELD
-
-  static basePublicStaticMethod() {
-    this.#PRIVATE_STATIC_FIELD = 42
-    return this.#PRIVATE_STATIC_FIELD
-  }
-}
-
-class SubClass extends BaseClassWithPrivateStaticField { }
-
-assertThrows(() => SubClass.basePublicStaticMethod(), TypeError)
-
- -

私有实例字段

- -

私有实例字段使用 #名称(发音为“哈希名称”)声明,这些名称以 #开头。  #是名称本身的一部分, 声明和访问时也需要加上。

- -

封装由语言强制执行。 从作用域之外引用#名称是语法错误。

- -
class ClassWithPrivateField {
-  #privateField
-
-  constructor() {
-    this.#privateField = 42
-    this.#randomField = 666 // Syntax error
-  }
-}
-
-const instance = new ClassWithPrivateField()
-instance.#privateField === 42 // Syntax error
-
- -

私有方法

- -

私有静态方法

- -

像它们的公有等价方法一样,私有静态方法是在类本身而非类的实例上调用的。 像私有静态字段一样,只能从类声明内部访问它们。

- -

私有静态方法可能是生成器方法,异步方法和异步生成器方法。

- -
class ClassWithPrivateStaticMethod {
-    static #privateStaticMethod() {
-        return 42
-    }
-
-    static publicStaticMethod1() {
-        return ClassWithPrivateStaticMethod.#privateStaticMethod();
-    }
-
-    static publicStaticMethod2() {
-        return this.#privateStaticMethod();
-    }
-}
-
-assert(ClassWithPrivateStaticField.publicStaticMethod1() === 42);
-assert(ClassWithPrivateStaticField.publicStaticMethod2() === 42);
-
- -

使用this可能会导致意想不到的行为(因为this绑定规则适用)。

- -
class Base {
-    static #privateStaticMethod() {
-        return 42;
-    }
-    static publicStaticMethod1() {
-        return Base.#privateStaticMethod();
-    }
-    static publicStaticMethod2() {
-        return this.#privateStaticMethod();
-    }
-}
-
-class Derived extends Base {}
-
-console.log(Derived.publicStaticMethod1()); // 42
-console.log(Derived.publicStaticMethod2()); // TypeError
-
- -

私有实例方法

- -

私有实例方法是类实例上可用的方法,它们的访问方式与私有实例字段相同。

- -
class ClassWithPrivateMethod {
-  #privateMethod() {
-    return 'hello world'
-  }
-
-  getPrivateMessage() {
-      return this.#privateMethod()
-  }
-}
-
-const instance = new ClassWithPrivateMethod()
-console.log(instance.getPrivateMessage())
-// expected output: "hello worl​d"
- -

私有实例方法可以是生成器方法,异步方法或异步生成器方法。 私有的getter和setter也是可能的:

- -
class ClassWithPrivateAccessor {
-  #message
-
-  get #decoratedMessage() {
-    return `✨${this.#message}✨`
-  }
-  set #decoratedMessage(msg) {
-    this.#message = msg
-  }
-
-  constructor() {
-    this.#decoratedMessage = 'hello world'
-    console.log(this.#decoratedMessage)
-  }
-}
-
-new ClassWithPrivateAccessor();
-// expected output: "✨hello worl​d✨"
-
- -

规范

- - - - - - - - - - - - -
Specification
{{SpecName('Public and private instance fields', '#prod-FieldDefinition', 'FieldDefinition')}}
- -

浏览器兼容性

- -

{{Compat("javascript.classes.private_class_fields")}}

- -

相关链接

- - diff --git a/files/zh-cn/web/javascript/reference/classes/private_class_fields/index.md b/files/zh-cn/web/javascript/reference/classes/private_class_fields/index.md new file mode 100644 index 0000000000..70803df8a1 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/classes/private_class_fields/index.md @@ -0,0 +1,199 @@ +--- +title: 类私有域 +slug: Web/JavaScript/Reference/Classes/Private_class_fields +tags: + - JavaScript + - 类 + - 语言特性 +translation_of: Web/JavaScript/Reference/Classes/Private_class_fields +--- +
{{JsSidebar("Classes")}}
+ +

类属性在默认情况下是公共的,可以被外部类检测或修改。在ES2020 实验草案 中,增加了定义私有类字段的能力,写法是使用一个#作为前缀。

+ +

语法

+ +
class ClassWithPrivateField {
+  #privateField
+}
+
+class ClassWithPrivateMethod {
+  #privateMethod() {
+    return 'hello world'
+ }
+}
+
+class ClassWithPrivateStaticField {
+  static #PRIVATE_STATIC_FIELD
+}
+
+ +

 例子

+ +

私有静态字段

+ +

私有字段可以被类的构造方法(constructor)从内部声明。

+ +

静态变量只能被静态方法调用的限制仍然成立。

+ +
class ClassWithPrivateStaticField {
+  static #PRIVATE_STATIC_FIELD
+
+  static publicStaticMethod() {
+    ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42
+    return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD
+  }
+}
+
+assert(ClassWithPrivateStaticField.publicStaticMethod() === 42)
+ +

在类评估时,私有静态字段被添加到类构造函数中。

+ +

私有静态字段有一个来源限制, 只有定义该私有静态字段的类能访问该字段。

+ +

这可能会导致:当使用this时出现意想不到的行为。

+ +
class BaseClassWithPrivateStaticField {
+  static #PRIVATE_STATIC_FIELD
+
+  static basePublicStaticMethod() {
+    this.#PRIVATE_STATIC_FIELD = 42
+    return this.#PRIVATE_STATIC_FIELD
+  }
+}
+
+class SubClass extends BaseClassWithPrivateStaticField { }
+
+assertThrows(() => SubClass.basePublicStaticMethod(), TypeError)
+
+ +

私有实例字段

+ +

私有实例字段使用 #名称(发音为“哈希名称”)声明,这些名称以 #开头。  #是名称本身的一部分, 声明和访问时也需要加上。

+ +

封装由语言强制执行。 从作用域之外引用#名称是语法错误。

+ +
class ClassWithPrivateField {
+  #privateField
+
+  constructor() {
+    this.#privateField = 42
+    this.#randomField = 666 // Syntax error
+  }
+}
+
+const instance = new ClassWithPrivateField()
+instance.#privateField === 42 // Syntax error
+
+ +

私有方法

+ +

私有静态方法

+ +

像它们的公有等价方法一样,私有静态方法是在类本身而非类的实例上调用的。 像私有静态字段一样,只能从类声明内部访问它们。

+ +

私有静态方法可能是生成器方法,异步方法和异步生成器方法。

+ +
class ClassWithPrivateStaticMethod {
+    static #privateStaticMethod() {
+        return 42
+    }
+
+    static publicStaticMethod1() {
+        return ClassWithPrivateStaticMethod.#privateStaticMethod();
+    }
+
+    static publicStaticMethod2() {
+        return this.#privateStaticMethod();
+    }
+}
+
+assert(ClassWithPrivateStaticField.publicStaticMethod1() === 42);
+assert(ClassWithPrivateStaticField.publicStaticMethod2() === 42);
+
+ +

使用this可能会导致意想不到的行为(因为this绑定规则适用)。

+ +
class Base {
+    static #privateStaticMethod() {
+        return 42;
+    }
+    static publicStaticMethod1() {
+        return Base.#privateStaticMethod();
+    }
+    static publicStaticMethod2() {
+        return this.#privateStaticMethod();
+    }
+}
+
+class Derived extends Base {}
+
+console.log(Derived.publicStaticMethod1()); // 42
+console.log(Derived.publicStaticMethod2()); // TypeError
+
+ +

私有实例方法

+ +

私有实例方法是类实例上可用的方法,它们的访问方式与私有实例字段相同。

+ +
class ClassWithPrivateMethod {
+  #privateMethod() {
+    return 'hello world'
+  }
+
+  getPrivateMessage() {
+      return this.#privateMethod()
+  }
+}
+
+const instance = new ClassWithPrivateMethod()
+console.log(instance.getPrivateMessage())
+// expected output: "hello worl​d"
+ +

私有实例方法可以是生成器方法,异步方法或异步生成器方法。 私有的getter和setter也是可能的:

+ +
class ClassWithPrivateAccessor {
+  #message
+
+  get #decoratedMessage() {
+    return `✨${this.#message}✨`
+  }
+  set #decoratedMessage(msg) {
+    this.#message = msg
+  }
+
+  constructor() {
+    this.#decoratedMessage = 'hello world'
+    console.log(this.#decoratedMessage)
+  }
+}
+
+new ClassWithPrivateAccessor();
+// expected output: "✨hello worl​d✨"
+
+ +

规范

+ + + + + + + + + + + + +
Specification
{{SpecName('Public and private instance fields', '#prod-FieldDefinition', 'FieldDefinition')}}
+ +

浏览器兼容性

+ +

{{Compat("javascript.classes.private_class_fields")}}

+ +

相关链接

+ + -- cgit v1.2.3-54-g00ecf