美文网首页js
js中,class属性前的#号表示私有字段或方法

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

作者: 星火下 | 来源:发表于2023-11-20 10:27 被阅读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(); // 错误,无法调用私有方法
    

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

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

    相关文章

      网友评论

        本文标题:js中,class属性前的#号表示私有字段或方法

        本文链接:https://www.haomeiwen.com/subject/ygkvwdtx.html