js

js中,class属性前的#号表示私有字段或方法

2023-11-20  本文已影响0人  星火下

在JavaScript中,class属性前的#号表示私有字段或方法。私有字段或方法只能在类内部访问,外部无法直接访问或修改它们。这种符号被称为私有字段或方法的私有名称。

例如,考虑以下示例:

class MyClass {
  #privateField = 10;

  #privateMethod() {
    console.log('This is a private method');
  }
  
  publicMethod() {
    console.log('This is a public method');
    console.log(this.#privateField); // 可以在类内部访问私有字段
    this.#privateMethod(); // 可以在类内部调用私有方法
  }
}

const myObject = new MyClass();
myObject.publicMethod();
console.log(myObject.#privateField); // 错误,无法访问私有字段
myObject.#privateMethod(); // 错误,无法调用私有方法

在上面的例子中,#privateField 是一个私有字段,只能在 MyClass 类的内部访问。#privateMethod 是一个私有方法,只能在 MyClass 类的内部调用。外部无法直接访问或修改私有字段,也无法调用私有方法。只有在类内部的其他方法中,可以访问私有字段或调用私有方法。

需要注意的是,私有字段和方法的名称是唯一的,它们只在定义它们的类中有效,与继承关系无关。

在JS中使用时的babel处理

安装@babel/plugin-proposal-private-methods和@babel/plugin-proposal-class-properties 并对babel进行如下配置

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    ['@babel/plugin-proposal-private-methods', {loose: true}],
    ['@babel/plugin-proposal-class-properties', {loose: true}],
  ],
};

代码修改

如果要将上述示例中的私有字段和方法改为不带 # 号的版本,可以使用传统的命名约定来表示私有性。通常约定使用下划线 _ 作为私有字段和方法的前缀,以示其私有性。

以下是修改后的示例代码:

class MyClass {
  _privateField = 10;

  _privateMethod() {
    console.log('This is a private method');
  }
  
  publicMethod() {
    console.log('This is a public method');
    console.log(this._privateField); // 可以在类内部访问私有字段
    this._privateMethod(); // 可以在类内部调用私有方法
  }
}

const myObject = new MyClass();
myObject.publicMethod();
console.log(myObject._privateField); // 错误,无法访问私有字段
myObject._privateMethod(); // 错误,无法调用私有方法

在上述修改后的代码中,私有字段和方法使用 _ 前缀来表示其私有性。外部仍然无法直接访问或调用私有字段和方法,只能在类内部进行访问和调用。

需要注意的是,修改后的代码依赖于开发者的约定和意识,而不具备真正的强制执行私有性的机制。开发者在使用类时应该遵循约定,不直接访问或调用私有字段和方法,以确保封装性和安全性。

上一篇下一篇

猜你喜欢

热点阅读