在 ECMAScript 2020 (ES11) 中,一个重要的新增特性是 private class fields。它可以让类的属性与方法变得更加私密,不会被外部访问或覆盖。它对于建立可维护的大型代码库具有重要意义。
为什么需要私有属性
在 JavaScript 类定义中,属性通常被定义为类的原型属性,因此可以被共享和访问。如果一个属性是被定义为私有的,那么让它只能被类的内部方法访问,这样会增强代码的安全性。例如:
-- -------------------- ---- ------- ----- ------ - ----------------- ---- - --------- - ----- -------- - ---- - -------- - ------ --------- - -------- - ------ -- -- - --------- - - ----- ------ - --- ------------ ----- ---- ----------------------------- -- -- -- - --------
在上面的例子中,secret
方法可以在类内调用,但外部代码无法访问它。但是在其他方法中,我们也可以轻松访问 name
和 age
属性,这可能会让我们在更改属性时出现错误。
使用私有属性
为了解决上述问题,ES11 引入了私有属性。类可以定义私有属性,这些属性仅对类内的方法可见和可访问。新的 #
符号用于声明私有属性和方法。例如:
-- -------------------- ---- ------- ----- ------ - -------- ----------------- ---- ------- - --------- - ----- -------- - ---- ------------ - ------- - -------- - ------ --------- - ----------- - ------ ------------- - ---------------- - ----------------- -- ----------- - -------------- - ---------------------- ----------------- -- ---------- - - ----- ------ - --- ------------ ----- --- -- -- - ---------- -------------------------------- -- -- -- - -------- ---------------------- -- ---- -- -------- ---- -- -------
在上面的例子中,我们定义了一个私有属性 #secret
,属性值只能在类的构造函数中设置,本身不可直接访问。类内的 getSecret
方法可以访问 #secret
属性,并将其值公开。同时,我们还定义了一个私有方法 #privateMethod
,它只能在类的内部中调用。公开的 publicMethod
调用了私有方法和一个公开的 console.log
实现。
暂时性死区
需要注意的是,私有属性和方法具有一个暂时性死区(Temporal Dead Zone)的概念,这也是它们的重要特征之一。在类定义中声明私有属性之前,尝试访问它们将导致 ReferenceError
。
-- -------------------- ---- ------- ----- ------ - ------------------- - ------------ - ------- -- -------------- - ---------------- -- -- -------------- -------- -
支持程度
需要注意的是,私有属性和方法的支持程度因使用的 JavaScript 实现而异。大多数现代浏览器(Chrome, Firefox, Safari) 和 Node.js 都已实现与支持 private class fields。同样,TypeScript 和 Babel 也可以提供 ES11 语法的转换和支持。
结论
私有属性和方法是 ES11 引入的一项重要特性。它为类的属性和方法提供了额外的保护层,帮助开发人员更好地组织和保护代码。我们现在可以创建安全的数据模型,确保只有我们想让访问我们的私有属性和方法。
参考
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672b3333ddd3a70eb6d21870