JavaScript 是一种基于原型的语言,没有传统面向对象语言的公共/私有/受保护等访问控制级别,开发人员不得不通过约定来达到相同的效果。这不仅增加了维护成本,而且不太安全。
ES11 的 private 访问符在类中引入了以下概念:
- 私有实例字段:仅在类内部可见的实例成员
- 私有静态字段:仅在类内部可见的静态成员
它们都可以使用符号#作为前缀定义,如下所示:
class Foo { #x = 0; // Private instance field static #count = 0; // Private static field constructor(x) { this.#x = x; Foo.#count++; } }
这个例子定义了一个名为 Foo 的类,它有一个私有实例字段 x 和一个私有静态字段 count。
访问私有成员
私有实例成员和私有静态成员不能从类外访问。任何尝试访问它们的代码都会导致 SyntaxError:
const foo = new Foo(123); foo.#x; // SyntaxError Foo.#count; // SyntaxError
但是,类内部可以访问这些成员:
-- -------------------- ---- ------- ----- --- - -- - -- ------ - ------ -------- - - ----- --- - --- --------- ----------- -- ------- --- ------- -- -----------
私有成员的继承
私有实例成员和私有静态成员不能从子类访问。它们不像公共成员、受保护成员和私有方法那样可访问。如果我们在子类中定义同样名字的私有成员(使用#前缀),它们将隐藏父类的同名成员。这种行为与其他私有成员保持一致。
class Foo { #x = 0; } class Bar extends Foo { #x = 1; // Hides Foo’s #x }
继承的私有成员虽然已被隐藏,但不影响基类本身的私有成员的访问。我们可以通过定义一个受保护的访问器方法来访问它:
-- -------------------- ---- ------- ----- --- - -- - -- -------- - ------ -------- - ------- - ------ -------------- - - ----- --- ------- --- - -- - -- ------- - ------ ------------- - -------- - - ----- --- - --- ------ ------------ -- ------- -
总结
ES11 的私有访问符号为在类定义中引入了一个新概念,它允许开发人员定义仅在类内部可见的成员。这消除了原型约定和风格的需要,并带来了更好的可维护性和安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648d8a0848841e9894bdb4c0