类私有域

您所在的位置:网站首页 js-08-b3 类私有域

类私有域

2023-05-31 19:20| 来源: 网络整理| 查看: 265

私有字段包括私有实例字段和私有静态字段。

私有实例字段

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

从作用域之外引用 # 名称、内部在未声明的情况下引用私有字段、或尝试使用 delete 移除声明的字段都会抛出语法错误。

class ClassWithPrivateField { #privateField; constructor() { this.#privateField = 42; delete this.#privateField; // 语法错误 this.#undeclaredField = 444; // 语法错误 } } const instance = new ClassWithPrivateField() instance.#privateField === 42; // 语法错误

备注: 可以使用 in 运算符检查私有字段(或私有方法)是否存在。当私有字段或私有方法存在时,运算符返回 true,否则返回 false。

类似于公有字段,私有字段在构造(construction)基类或调用子类的 super() 方法时被添加到类实例中。

class ClassWithPrivateField { #privateField; constructor() { this.#privateField = 42; } } class SubClass extends ClassWithPrivateField { #subPrivateField; constructor() { super(); this.#subPrivateField = 23; } } new SubClass(); // SubClass {#privateField: 42, #subPrivateField: 23} 私有静态字段

私有静态字段在解析类结构时被添加到类的构造方法(constructor)中。且静态变量只能被静态方法调用的限制仍然成立。

class ClassWithPrivateStaticField { static #PRIVATE_STATIC_FIELD; static publicStaticMethod() { ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42; return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD; } } console.log(ClassWithPrivateStaticField.publicStaticMethod() === 42); // true

私有静态字段有一个来源限制:只有定义该私有静态字段的类能访问该字段。使用 this 可能会出现意想不到的行为。在下方的例子中,this 是 SubClass 类(而不是 BaseClassWithPrivateStaticField 类)的引用,所以尝试调用 SubClass.basePublicStaticMethod() 会抛出 TypeError。

class BaseClassWithPrivateStaticField { static #PRIVATE_STATIC_FIELD; static basePublicStaticMethod() { this.#PRIVATE_STATIC_FIELD = 42; return this.#PRIVATE_STATIC_FIELD; } } class SubClass extends BaseClassWithPrivateStaticField { }; let error = null; try { SubClass.basePublicStaticMethod() } catch(e) { error = e}; console.log(error instanceof TypeError); // true console.log(error); // TypeError: Cannot write private member #PRIVATE_STATIC_FIELD // to an object whose class did not declare it


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3