使用js如何创建一个private方法?

在JavaScript中,没有真正的私有方法的关键字(像Java或C#中的private)。但是,有几种方法可以实现类似私有方法的行为,提供不同程度的封装和安全性。

1. 使用Symbol作为属性名:

这种方法利用Symbol的唯一性来创建“私有”属性,从而间接地创建“私有”方法。虽然技术上仍然可以访问,但这种方法增加了访问的难度,更像是一种约定俗成的私有方法。

const MyClass = (() => {
  const privateMethodSymbol = Symbol('privateMethod');

  return class {
    publicMethod() {
      this[privateMethodSymbol]();
    }

    [privateMethodSymbol]() {
      console.log('This is a "private" method.');
    }
  };
})();

const instance = new MyClass();
instance.publicMethod(); // 输出: This is a "private" method.
// instance[privateMethodSymbol](); //  错误: privateMethodSymbol未定义 (在外部作用域)

// 虽然可以通过Object.getOwnPropertySymbols(instance)获取Symbol,但这需要额外的步骤,并且表明访问者有意绕过约定。

2. 使用闭包:

这是最常见和最有效的方法。通过将方法定义在构造函数的闭包内,外部无法直接访问这些方法。

function MyClass() {
  function privateMethod() {
    console.log('This is a private method.');
  }

  this.publicMethod = function() {
    privateMethod();
  };
}

const instance = new MyClass();
instance.publicMethod(); // 输出: This is a private method.
// instance.privateMethod(); //  错误: privateMethod is not a function

3. 使用WeakMap:

这种方法更安全,因为它将私有方法存储在WeakMap中,与对象实例的关联是弱引用,不会阻止垃圾回收。

const privateMethods = new WeakMap();

class MyClass {
  constructor() {
    privateMethods.set(this, {
      privateMethod: () => {
        console.log('This is a private method.');
      },
    });
  }

  publicMethod() {
    privateMethods.get(this).privateMethod();
  }
}

const instance = new MyClass();
instance.publicMethod(); // 输出: This is a private method.
// instance.privateMethod(); //  错误: privateMethod is not a function
// 无法直接访问privateMethods中的方法

总结:

  • 闭包: 最常用,简单有效。
  • Symbol: 更像是一种约定,安全性较低。
  • WeakMap: 最安全,但稍微复杂一些。

选择哪种方法取决于你的具体需求和对私有性的要求。 如果只需要一种简单的隐藏方法的方式,闭包就足够了。如果需要更高的安全性,WeakMap是最佳选择。 Symbol方法则介于两者之间。

希望这些信息能帮到你!

posted @   王铁柱6  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示