ECMAScript 2020 (ES11) 新特性:private class fields

在 ECMAScript 2020 (ES11) 中,一个重要的新增特性是 private class fields。它可以让类的属性与方法变得更加私密,不会被外部访问或覆盖。它对于建立可维护的大型代码库具有重要意义。

为什么需要私有属性

在 JavaScript 类定义中,属性通常被定义为类的原型属性,因此可以被共享和访问。如果一个属性是被定义为私有的,那么让它只能被类的内部方法访问,这样会增强代码的安全性。例如:

----- ------ -
  ----------------- ---- -
    --------- - -----
    -------- - ----
  -

  -------- -
    ------ ---------
  -

  -------- -
    ------ -- -- - ---------
  -
-

----- ------ - --- ------------ ----- ----
----------------------------- -- -- -- - --------

在上面的例子中,secret 方法可以在类内调用,但外部代码无法访问它。但是在其他方法中,我们也可以轻松访问 nameage 属性,这可能会让我们在更改属性时出现错误。

使用私有属性

为了解决上述问题,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