首页 > 其他分享 >使用js如何创建一个private方法?

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

时间:2024-12-10 09:25:03浏览次数:5  
标签:privateMethod const 创建 private js instance 方法 method

在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方法则介于两者之间。

希望这些信息能帮到你!

标签:privateMethod,const,创建,private,js,instance,方法,method
From: https://www.cnblogs.com/ai888/p/18596555

相关文章

  • 升级易优EyouCms到1.6.9版本后,发表内容时没有弹窗,JS无法加载,是什么原因?
    在升级易优EyouCms到1.6.9版本后,如果遇到发表内容时没有弹窗且JS无法加载的问题,通常是由于网站启用了SSL(HTTPS)而内部资源引用仍然使用HTTP协议导致的。这种情况下,浏览器会阻止混合内容(即HTTPS页面中加载HTTP资源),从而导致JS文件无法正确加载。以下是详细的解决步骤和注意事项:解决......
  • 前端 js + html + css 特效 001
    <!DOCTYPEhtml><htmllang="en"><head><title>CodeTheWorld-Electricstrings</title><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><sc......
  • C++链表的创建与基本操作
    在C++中,链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有灵活的内存管理和高校的插入与删除操作,但访问效率较低。链表的每个节点通常包含两部分:1、数据部分(存储链表中元素的数据);2、指针部分(指向链表中的下一个节点)。链表类型主......
  • node.js毕设城科毕业生就业管理系统app程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于毕业生就业管理系统的研究,现有研究主要以就业信息平台或就业指导网站等为主,专门针对城科毕业生就业管理系统app的研究较少。在国内外就业形势日益复......
  • node.js毕设城市出行行程智能推荐系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于城市出行行程智能推荐系统的研究,现有研究主要以单一出行方式的优化或通用的路径规划为主,专门针对整合多种出行方式并依据用户个性化需求来智能推荐......
  • node.js毕设城市房屋租赁出售系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于城市房屋租赁出售系统的研究,现有研究多集中于房地产市场的宏观分析或传统交易模式的局部优化。专门针对整合城市房屋租赁与出售业务于一体,借助信息......
  • JS-7 typeof 运算符
    数值:number、字符串:string、布尔值:bookan、对象:objectJavaScript有三种方法,可以确定一个值到底是什么类型,而我们现在需要接触到的就是typeof1、数值返回numbertypeo123//"number"2、字符串返回stringtypeof'123'//"string"3、布尔值返回booleantypeof......
  • 学生信息数据库的创建
    需求分析学生信息数据库用来存储学生的一些相关信息,其中包括学生所在院系,学生基础信息,老师信息表,学生总成绩,学生各学科成绩,专业课基础信息。并构建不同的用户使其各自分配不同的权限,对整个数据库进行维护。例如:班主任进行学生总成绩的维护,各科老师对各科成绩表以及专业基础表......
  • JS-6 数据类型
    数据类型:数值、字符串、布尔值、undefined、null、对象1、数据类型分类JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。(ES6又新增了第七种Symbol类型的值和第八种BIglnt类型)2、数据类型分类原始分类(基础类型):数值、字符串、布尔值。......
  • JS代码片段-Array数组克隆的几种方法
    JavaScript自身提供了几种克隆数组的方法,以下做了汇总,以作参考:1.展开运算符(...) ES6引入了展开运算符(...),这是创建数组浅克隆最常见的方法。leta=[1,2,3,4,5];letb=[...a];2.Array.from()leta=[1,2,3,4,5];letb=Array.from(a);3.Array.prototype.s......