要扩展@loganfsmyth的回答:

JavaScript中唯一真正私有的数据仍然是作用域变量。不能以与公共属性相同的方式在内部访问私有属性,但是可以使用范围变量来存储私有数据。

作用域变量

这里的方法是使用构造函数的作用域(它是私有的)来存储私有数据。要使方法能够访问这些私有数据,它们也必须在构造函数中创建,这意味着您要用每个实例重新创建它们。这是一个性能和内存的惩罚,但一些人认为这个惩罚是可以接受的。可以避免对不需要访问私有数据的方法进行惩罚,方法可以像往常一样将它们添加到原型中。

例子:function Person(name) {

let age = 20; // this is private

this.name = name; // this is public

this.greet = function () {

// here we can access both name and age

console.log(`name: ${this.name}, age: ${age}`);

};}let joe = new Person('Joe');joe.greet();// here we can access name but not age

作用域WeakMap

WeakMap可以用来避免先前方法的性能和内存损失。WeakMaps将数据与对象(此处为实例)关联起来,使其只能使用该WeakMap进行访问。因此,我们使用作用域变量方法创建私有WeakMap,然后使用该WeakMap检索与this..这比作用域变量方法更快,因为所有实例都可以共享一个WeakMap,因此您不需要仅仅为了使它们访问自己的WeakMaps而重新创建方法。

例子:let Person = (function () {

let privateProps = new WeakMap();

class Person {

constructor(name) {

this.name = name; // this is public

privateProps.set(this, {age: 20}); // this is private

}

greet() {

// Here we can access both name and age

console.log(`name: ${this.name}, age: ${privateProps.get(this).age}`);

}

}

return Person;})();let joe = new Person('Joe');joe.greet();// here we can access joe's name but not age

本例使用一个对象对多个私有属性使用一个WeakMap;您还可以使用多个WeakMaps,并使用它们如下age.set(this, 20),或者编写一个小包装并以另一种方式使用它,如privateProps.set(this, 'age', 0).

从理论上讲,这种方法的隐私可能会被篡改全球的行为所破坏。WeakMap对象。也就是说,所有的JavaScript都可能被破损的全局破坏。我们的代码已经建立在这样的假设之上。

(这个方法也可以用Map,但是WeakMap更好是因为Map除非您非常小心,否则将产生内存泄漏,为此目的,两者在其他方面并没有什么不同。)

半答案:限定范围的符号

符号是一种可以用作属性名称的原语值类型。可以使用作用域变量方法创建私有符号,然后将私有数据存储在this[mySymbol].

此方法的隐私可能会被侵犯Object.getOwnPropertySymbols,但做起来有点尴尬。

例子:let Person = (function () {

let ageKey = Symbol();

class Person {

constructor(name) {

this.name = name; // this is public

this[ageKey] = 20; // this is intended to be private

}

greet() {

// Here we can access both name and age

console.log(`name: ${this.name}, age: ${this[ageKey]}`);

}

}

return Person;})();let joe = new Person('Joe');joe.greet();// Here we can access joe's name and, with a little effort, age. ageKey is

// not in scope, but we can obtain it by listing all Symbol properties on// joe with `Object.getOwnPropertySymbols(joe)`.

半答案:下划线

旧的默认值,只需使用带有下划线前缀的公共属性。尽管在任何情况下都不是私有财产,但这种约定非常普遍,因此它很好地传达了读者应该将该财产视为私有财产,这通常会使工作完成。作为交换,我们得到了一种更容易阅读、更容易打字和更快的方法。

例子:class Person {

constructor(name) {

this.name = name; // this is public

this._age = 20; // this is intended to be private

}

greet() {

// Here we can access both name and age

console.log(`name: ${this.name}, age: ${this._age}`);

}}let joe = new Person('Joe');joe.greet();// Here we can access both joe's name and age. But we know we aren't

// supposed to access his age, which just might stop us.

结语

截至2017年,私人地产仍没有完美的做法。各种方法各有优缺点。作用域变量是真正的私有变量;作用域WeakMaps非常私有,比作用域变量更实用;作用域符号具有合理的私有性和合理的实用性;下划线通常具有足够的私有性和非常实用性。

es6 类的私有属性_JavaScript ES6类中的私有属性相关推荐

  1. python中属于私有属性的是_Python中的实例属性和私有属性

    相关知识点 实例属性 实例属性和类属性的区别在于实例属性定义在类的__init__()魔法方法中,而类属性定义在类下: 1 classC:2 b = 1 #类属性 3 4 def __init__(s ...

  2. python私有属性怎么定义_Python中定义私有属性的方法是()。

    [判断题]请假条带有请求的性质,所以一般来说篇幅要尽量长一些,以示郑重;更多要用煽情性语句,以打动对方.( ) [单选题]关于类和对象的关系,下列描述正确的是(). [选择]Трудоспособны ...

  3. 如何查看 el-form-item 的prop属性_PHP 7.4中的类型属性(Typed Properties)

    php中文网最新课程 每日17点准时技术干货分享 在PHP 7.4中添加了类型属性,并对PHP的类型系统进行了重大改进.这些更改是完全可选的,并且不破坏以前的版本. 在这篇文章中,我们将深入了解这个特 ...

  4. 继承能够访问父类私有字段_在单元测试中访问私有字段

    继承能够访问父类私有字段 首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很 ...

  5. 访问的属性未定义_V8中的快属性

    在这篇博客文章中,我们将解释 V8 在内部是怎么处理 JavaScript properties 的.从 JavaScript 的角度来看,properties 只有几个必要的区别.JavaScrip ...

  6. Java构造函数可以私有,我们可以在Java中使用私有的构造函数吗?

    甲构造用于创建时初始化对象.从语法上讲,它类似于一种方法.区别在于,构造函数的名称与其类相同,并且没有返回类型. 无需显式调用构造函数,这些构造函数会在实例化时自动调用. 构造函数允许的访问说明符/修 ...

  7. python中bd是什么属性_聊一聊:Python中对象的属性

    作者:Vamei 出处:http://www.cnblogs.com/vamei Python一切皆对象(object),每个对象都可能有多个属性(attribute).Python的属性有一套统一的 ...

  8. 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )

    文章目录 一.创建 XmlParser 解析器 二.获取 Xml 文件中的节点 三.获取 Xml 文件中的节点属性 四.完整代码示例 一.创建 XmlParser 解析器 创建 XmlParser 解 ...

  9. 计算机操作员 word2003 设置表格的跨页断行属性,不可以,word中的表格属性不勾选“允许跨页断行”为什么还是断行了?-为什么word跨页表格,word表格不能跨页...

    不能跨页断行,是因为设置了指定高度造成的. 1.首先双击打开需要编辑的Word文档,进入到Word文档编辑界面中. 2.接下来需要鼠标左键单击Word表格zd,鼠标右键单击选择打开菜单栏中的" ...

最新文章

  1. C语言二维数组元素的多种表示方法小结
  2. Ms SQL Server 约束和规则
  3. C++对象产生和销毁的顺序
  4. 微信公众平台开发(112) 微信卡券
  5. 肌酸怎么吃效果最好?为什么使用肌酸没有效果!
  6. Fedora 24 x86 安装VirtualBox
  7. 学习通网络看课鼠标不能离开页面问题
  8. 视频格式转换应该用哪个视频转换软件最好呢?
  9. Win10 CMD命令大全 命令提示符常用命令有哪些
  10. 斐讯手表怎么刷机华为系统_智能手表怎么刷机?
  11. HP笔记本电脑如何设置屏幕亮度
  12. java delphi aes加密算法_谁有C#与delphi通用的AES加密算法
  13. java课程心得_Java课程的感想
  14. python查看微信撤回消息怎么弄_Python3爬虫查看微信撤回消息
  15. logstash(10)过滤器-dissect
  16. mac 教程 终端设置代理
  17. 苹果手机软件闪退怎么解决_LOL手游卡顿闪退怎么办-卡顿闪退解决方法解析
  18. PHP实现发送邮件功能代码|PHP怎么实现QQ邮件发送|Php发送邮件代码
  19. c语言仿ce内存搜索工 源代码_CE的AOB_scan功能源码内存搜索特征码
  20. python脚本修改hosts文件

热门文章

  1. php pdo操作mysql_PHP操作数据库详细(PDO)
  2. Linux进程全解10——守护进程
  3. s5pv210——LCD的原理和实战
  4. 统计文章中字母出现频率
  5. django 模板继承与重写
  6. 【Python】模块学习之ConfigParser读写配置信息
  7. Hibernate学习笔记③
  8. struts2学习笔记之十一:struts2的类型转换器
  9. DOM getElementById
  10. 一段挂起进程中所有线程的代码