JS 私有属性的 6 种实现方式,你用过几种?

如题所述

在编程中,类(class)是创建对象的模板,由一系列属性和方法构成,用于表示对同一概念的数据和操作。其中,有的属性和方法是对外公开的,而有的属性和方法仅限于内部使用,即私有的。

实现私有属性和方法的方式多种多样,以下列举了六种常见的方式,分别进行解释:

1. **下划线命名法 (_prop)**:通过在属性名和方法名前加上下划线(_),在命名上区分私有和公有。例如,`Dong.name`为私有属性,而`Dong.friend`为公有属性。这种方式仅是一种命名规范,告诉开发者不要直接调用私有属性和方法,但不能强制阻止访问。

2. **使用 Proxy**:通过Proxy对象,可以定义get、set和Object.keys的逻辑,实现对于下划线开头属性的私有化。使用Proxy包装对象,可以控制对于属性的访问,例如`Dong`对象,通过`new Proxy(Dong, handler)`,可以阻止对下划线开头属性的访问。

3. **利用Symbol**:Symbol是ES2015引入的API,用于创建独一无二的值。通过使用Symbol生成唯一的属性名,可以实现私有属性。例如,使用`Dong._name`而非`Dong.name`来表示私有属性,外部无法直接访问到`_name`。

4. **WeakMap**:通过WeakMap可以实现私有属性,不将属性挂载到this上,避免外部访问。每个属性使用一个WeakMap来维护,通过`classPrivateFieldSet`和`classPrivateFieldGet`方法来实现属性的设置和获取。

5. **#prop语法糖**:在ES的新语法草案中,可以使用`#prop`来标识私有属性和方法,这使得属性和方法在编译时就具有私有性,运行时不可访问。例如,`Dong.#name`表示私有属性。

6. **TypeScript的private修饰符**:在TypeScript中,`private`修饰符用于声明类的私有属性和方法,限制了属性和方法的访问范围,仅限于类内部使用。在TypeScript中实现私有属性的方式较为直接。

在这六种实现私有属性的方法中,`_prop`、`Symbol`和`TypeScript的private修饰符`属于伪私有,它们仅在编译时具有限制性,而在运行时仍可能被访问。而`Proxy`、`WeakMap`和`#prop语法糖`是真正实现了私有化的手段,运行时无法直接访问私有属性和方法。

每种方法都有其适用场景和优缺点,选择合适的实现方式取决于具体的需求和项目的特性。了解并熟练使用这些方法,可以帮助开发者更有效地组织代码,维护良好的命名规范和访问控制,从而提高代码的可读性和安全性。
温馨提示:内容为网友见解,仅供参考
无其他回答

JS 私有属性的 6 种实现方式,你用过几种?
3. **利用Symbol**:Symbol是ES2015引入的API,用于创建独一无二的值。通过使用Symbol生成唯一的属性名,可以实现私有属性。例如,使用`Dong._name`而非`Dong.name`来表示私有属性,外部无法直接访问到`_name`。4. **WeakMap**:通过WeakMap可以实现私有属性,不将属性挂载到this上,避免外部访问。...

基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式...
es6 WeakMap 方案在 es6 中引入了 Map, WeakMap 容器,最大的特点是容器的键名可以是任意的数据类型,虽说初衷不是为了实现私有成员引入,但意外的可以被用来实现私有成员特性。主要的思路是,在类的级别上创建一个 WeakMap 容器,用于存储各个实例的私有成员,这个容器对外不可见,对内通过闭包方式可见...

怎么实现JS类私有属性
function User() { var _id; \/\/ 使用var即可定义私有属性 var _name; this.age = 1; \/\/ 共有属性,可以直接user.age this.setId = function(id) { _id = id; } this.setName = function(name) { _name = name; } this.getId = function() { r...

JS 对象(Object)的深入解析—私有属性
2.访问器属性 数据属性不包含数据值,包含一对get和set的核心方法,在读取访问器属性时,就是通过这两个方法进行操作处理的。 访问器属性的四个特性 configurable: 表示是否能被delete删除属性且能重新定义该属性。 enumerable: 表示能否通过for-in遍历的属性。 get: 读取属性时调用的方...

用下面这种方法实现js类的私有属性可行么?求大牛评价评价。
JS里实现所谓的“私有字段”,典型做法是用闭包;不过我建议你不要用闭包,它会对内存消耗、性能产生冲击,特别是你打算为每个对象的每个私有字段都用闭包的话!我在自己的程序库里做法是,以特殊模式作为字段名的前缀——c_LikeThis:公有(publi c)d_LikeThis:受保护(protecte d)e_LikeThis:...

Js可实现私有变量吗
var ClassA = function(){ var name = "yourname"; \/\/私有属性 var privateMethod = function() \/\/私有方法 { alert("private");};\/\/getter this.getName = function() { privateMethod();return name;} \/\/setter this.setName = function(newName){ name = newName;} };

js设计模式有哪几种
一.单例模式 单例模式也称作为单子模式,更多的也叫做单体模式。为软件设计中较为简单但是最为常用的一种设计模式。 在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法。要扩展该对象,可以添加自己的私有成员和方法,然后使用...

保护变量的安全实现JS私有属性和私有方法
闭包其实就是定义一个匿名方法并执行,在闭包里面定义的变量和方法,在闭包外面是无法访问的 (function(){ \/\/私有变量 var a="private"; \/\/私有方法 var test=function(){alert("test!");} \/\/向全局注册,提供外部访问的入口 window.pluginName=function(){ \/\/do something.....

javascript里面的index属性问题
你说的是不是z-index属性: js设置css: *总体评价

JS块级作用域和私有变量实例分析
原型模式定义共有方法:(function(){ \/\/私有变量和私有函数 var privateVariable = 10;function privateFunction(){ return false;} \/\/构造函数 MyObject = function(){ };\/\/公有\/特权方法 MyObject.prototype.publicMethod = function(){ privateVariable++;return privateFunction();};})();模块...

相似回答
大家正在搜