es6 类的私有属性_JavaScript ES6类中的私有属性

要扩展@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非常私有,比作用域变量更实用;作用域符号具有合理的私有性和合理的实用性;下划线通常具有足够的私有性和非常实用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python编程制作接金币游戏,闪电侠接金币的FlashMan类

python the Flash man catch coin gif animation闪电侠是美剧,这里是一个小游戏,操作闪电侠接不断冒出来的金币。本模块定义了FlashMan类。这个模块能单独运行,运行后用鼠标操作闪电侠移动即可。以下是部分代码预览:""&…

LeetCode 1660. 纠正二叉树(BFS)

文章目录1. 题目2. 解题1. 题目 你有一棵二叉树,这棵二叉树有个小问题,其中有且只有一个无效节点,它的右子节点错误地指向了与其在同一层且在其右侧的一个其他节点。 给定一棵这样的问题二叉树的根节点 root ,将该无效节点及其所…

MS SQL Server 常用操作

以下为常用: --发邮件应该很常用吧 exec msdb.dbo.sp_send_dbmailprofile_name mail_profile, --邮件配置主档,通过数据库邮件配置向导生成,一般叫dba_profile,详细看下图recipients email_recipients, --地址,多个用英文逗号隔…

arduino yun 京东_Arduino发布多款全新升级产品,宣布将成立Arduino基金会

上海2015年10月23日电 /美通社/ -- 10月18日上午,全球知名开源硬件供应商 Arduino 全球首席执行官 Federico Musto 现身上海创客嘉年华发表演讲。演讲中 Federico 发布了 Arduino Uno Pro、Arduino M0 S、 Arduino Leonardo XS、 Arduino Uno XS 以及机械手臂套件 B…

php 检测编码函数,自己写了一个php检测文件编码的函数

关于文件编码的检测,百度一下一大把都是,但是确实没有能用的、很多人建议 mb_detect_encoding 检测,可是不知为何我这不成功,什么都没输出、看到有人写了个增强版,用 BOM 判断的,我果断就无视了&#xff0c…

LeetCode 1730. 获取食物的最短路径(BFS)

文章目录1. 题目2. 解题1. 题目 你现在很饿,想要尽快找东西吃。你需要找到最短的路径到达一个食物所在的格子。 给定一个 m x n 的字符矩阵 grid ,包含下列不同类型的格子: * 是你的位置。矩阵中有且只有一个 * 格子。 # 是食物。矩阵中可…

python线程任务run_python线程、进程知识梳理

一.python线程线程用于提供线程相关的操作,线程是应用程序中工作的最小单元。#!/ usr / bin / env python# - * - coding:utf-8 - * -import threadingimport timedef show(arg):time.sleep(1)printthread …

jrtplib使用注意事项

一、说明 RTP 现在的问题是要解决的流媒体的实时传输的问题的最佳方法。和JRTPLIB 是一个用C语言实现的RTP库。包含UDP通讯。刚使用JRTPLIB,对JRTPLIB的理解还不够深,当做使用时,积累的一些经验写个笔记吧。 二、RTP协议 实时传送协议&#x…

oracle字符串使用函数,Oracle常用函数介绍之一(字符串)

最近工作需要从Excel 导入一些数据,由于源数据的不规范,需要进行数据的清洗工作,需要自己把耽误多日的Oracle 函数重新巩固一下。搜集了一些网络资料,整理下来,以供自己以后查对。1. ASCII返回与指定的字符对应的十进制…

JAVA中获得一个月最大天数的方法(备忘)

Calendar 类是一个抽象类,为日历字段之间的转换提供了一些方法。其中有一个重要方法 getActualMaximum ,该方法用于返回指定日历字段实际的最大值。 利用这个方法(Calendar.getActualMaximum),我们可以获得某年某月的天数。 代码如下&#xf…

LeetCode 1874. 两个数组的最小乘积和

文章目录1. 题目2. 解题1. 题目 给定两个长度相等的数组a和b&#xff0c;它们的乘积和为数组中所有的a[i] * b[i]之和&#xff0c;其中 0 < i < a.length。 比如a [1,2,3,4]&#xff0c;b [5,2,3,1]时&#xff0c;它们的乘积和为 1*5 2*2 3*3 4*1 22 现有两个长…

eplise怎么连接数据库_eclipse连接mysql

JDBC代表Java数据库连接(Java Database Connectivity)&#xff0c;它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API&#xff0c;换句话说&#xff1a;JDBC是用于在Java语言编程中与数据库连接的API。到www.mvnrepository.com网站中&#xff0c;搜索mysql&…

【NS2】在linux下安装低版本GGC

1、下载安装包&#xff0c;cd到文件所在目录 sudo dpkg -i gcc41-compat-4.1.2-ubuntu1210_i386.deb g41-compat-4.1.2_i386.deb 2、查看安装到系统的gcc ls /usr/bin/gcc* 3、 下载完包之后&#xff0c;建议是直接sudo dkpg -i *.deb这样安装 由于gcc安装互相有版本的支持&…

oracle+资料类型不一致吗,oracle数据库中,字段类型不一致,导致查询慢

最近一个WEBSERVICE突然变慢了&#xff0c;后查询发现&#xff0c;后台查询也非常慢(记录条数800多万)&#xff0c;索引也有&#xff0c;如下语句SELECT P.ID,P.RECORD_ID,P.KEY_NAME,P.KEY_CONTENTFROM MED_EMR_PATIENT_RECORD R,MED_EMR_RECORD_EXTRACTINFO PWHERE R.ID P.R…

LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个由整数数组组成的数组arrays&#xff0c;其中arrays[i]是严格递增排序的&#xff0c;返回一个表示所有数组之间的最长公共子序列的整数数组。 子序列是从另一个序列派生出来的序列&#xff0c;删除一些元素或不删除任何元素&#xff0…

最小二乘估计_相关性及最小二乘估计【20201026】

考前高考要求1.知识要求对知识的要求依次是了解、理解、掌握三个层次.2.能力要求(1)空间想象能力(2)抽象概括能力(3)推理论证能力(4)运算求解能力(5)数据处理能力(6)应用意识(7)创新意识3.个性品质要求个性品质是指考生个体的情感、态度和价值观.要求考生具有一定的数学视野&am…

mac node oracle,将Python3.5(Mac OS X El Capitan)连接到Oracle集群(远程)

我正在尝试将Python3.5(Mac OS X El Capitan)连接到Oracle集群(远程)。对于安装cx_Oracle&#xff0c;我设置了&#xff1a;export ORACLE_HOME/Applications/oracle/instantclient_11_2export LD_LIBRARY_PATH$ORACLE_HOMEexport DYLD_LIBRARY_PATH$ORACLE_HOMEexport PATH$OR…

oracle 只对成绩前三名进行排序其余不变_2021年采用美术统考成绩的重点院校名单汇总...

点击蓝字关注我们吧&#xff01;2019年底&#xff0c;教育部发文&#xff0c;除独立设置的本科艺术院校和参照院校(共48所)外&#xff0c;其余高校的美术学类和设计学类专业不允许组织校考。不管是211工程大学还是985工程大学&#xff0c;均被严格进行组织美术类校考。但是&…

LeetCode 1564. 把箱子放进仓库里 I(排序)

文章目录1. 题目2. 解题1. 题目 给定两个正整数数组 boxes 和 warehouse &#xff0c;分别包含单位宽度的箱子的高度&#xff0c;以及仓库中 n 个房间各自的高度。 仓库的房间分别从 0 到 n - 1 自左向右编号&#xff0c; warehouse[i] &#xff08;索引从 0 开始&#xff09;…

【原】push过快的错误 (Pushing the same view controller instance more than once is not supported)...

今天在点击按钮push viewController 时&#xff0c;控制台报错&#xff1a; Terminating app due to uncaught exception NSInvalidArgumentException, reason: Pushing the same view controller instance more than once is not supported 网上查了以下原因, 是说过快点击可能…