首页 > 语言 > JavaScript > 正文

详解JavaScript 新语法之Class 的私有属性与私有方法

2024-05-06 15:40:16
字体:
来源:转载
供稿:网友

译者按: 为什么偏要用 # 符号?

原文:JavaScript's new #private class fields
•译者:Fundebug

本文采用意译,版权归原作者所有

proposal-class-fieldsproposal-private-methods定义了 Class 的私有属性以及私有方法,这 2 个提案已经处于 Stage 3,这就意味着它们已经基本确定下来了,等待被加入到新的 ECMAScript 版本中。事实上,最新的 Chrome 已经支持了 Class 私有属性。

那么,对于 Class 的私有属性与私有方法,它们究竟是什么呢?它们是怎样工作的?为什么要使用#符号来定义呢?

Class 的私有属性语法如下:

class Point { #x; #y; constructor(x, y) {  this.#x = x;  this.#y = y; } equals(point) {  return this.#x === point.#x && this.#y === point.#y; }}

我们可以将其语法理解为 2 个部分:

•定义 Class 私有属性
•引用 Class 私有属性

定义 Class 私有属性

私有属性与公共属性的定义方式几乎是一样的,只是需要在属性名称前面添加#符号:

class Foo { publicFieldName = 1; #privateFieldName = 2;}

定义私有属性的时候也可以不用赋值:

class Foo { #privateFieldName;}

引用 Class 私有属性

引用私有属性也只需要使用#就好了。

class Foo { publicFieldName = 1; #privateFieldName = 2; add() {  return this.publicFieldName + this.#privateFieldName; }}

其中,this.#可以简化,去掉 this 也没问题,下面两种写法是等价的:

method() { #privateFieldName;}method() { this.#privateFieldName;}

在 Class 定义中引用 Class 实例的私有属性

对于私有属性,我们是不可以直接通过 Class 实例来引用的,这也是私有属性的本来含义。但是有一种情况除外,在 Class 定义中,我们可以引用 Class 实例的私有属性:

class Foo { #privateValue = 42; static getPrivateValue(foo) {  return foo.#privateValue; }}

Foo.getPrivateValue(new Foo()); // >> 42

其中,foo是Foo的实例,在 Class 定义中,我们可以通过 foo 来引用私有属性#privateValue。

Class 的私有方法

Class 的私有属性是提案proposal-class-fields的一部分,这个提案只关注 Class 的属性,它并没有对 Class 的方法进行任何修改。而 Class 的私有方法是提案proposal-class-fields的一部分。

Class 的私有方法语法如下:

class Foo { constructor() {  this.#method(); } #method() {  // ... }}

我们也可以将函数赋值给私有属性:

class Foo { constructor() {  this.#method(); } #method = () => {  // ... };}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选