详解 JavaScript 的私有变量

 JavaScript最近有不少改进,新的语法和特性一直在添加。但有些事情不会改变,全部的东西仍然是一个对象,几乎全部的东西均可以在运行时改变,也没有公有/私有属性的概念。可是咱们能够用一些技巧来改变这些,在这篇文章中,我将研究实现私有属性的各类方法javascript

 
 

JavaScriopt 在 2015 年引入了“”这种你们都熟悉的面向对象方法,基于 C 语言的经典语言 Java 和 C# 就提供这种方法。不过很快你们就发现这些类并非习惯的那样 —— 他们没有控制访问的属性修饰符,并且全部属性都必须定义在函数中。java

那么,咱们该如何保护那些不该该在运行期间被修改的数据呢?先来看一些办法。函数

这篇文章中我会使用一个建立图形的类做为示例。它的宽度和高度只能高度只能在初始化时设置,同时提供一个用于获取面积的属性。这些示例中用到了 get 关键字,你能够在个人文章 Getter 和 Setter 中了解到这一知识点this

命名规范

第一个方法是使用特定的命名来表示属性应该被视为私有,这是最成熟的方法。其常见做法是给属性名前缀一个下划线(好比 _count)。但这种方法不能阻止值被访问或被修改,它依赖于不一样开发者之间的共识,公认这个值应该被禁止访问。spa

class Shape { constructor(width, height) { this._width = width; this._height = height; } get area() { return this._width * this._height; } } const square = new Shape(10, 10); console.log(square.area); // 100 console.log(square._width); // 10

WeakMap

使用 WeakMap 保存私有值的方法限制性会稍微强一些。虽然这个方法仍然不能阻止访问数据,但它把私有值与用户交互对象隔离开了。在这种技巧中,咱们把拥有私有属性的对象实例做为 WeakMap 的键,并使用一个函数(咱们称为 internal)来建立或返回一个存储全部私有属性值的对象。这种技术的优势是在枚举对象属性或者使用 JSON.stringify 时不会把私有属性显示出来,但它依赖 WeakMap,而 WeakMap 对象类的做用域外仍然能够被访问到,也能够进行操做。code

相关文章
相关标签/搜索