![]() |
1
117
私有字段正在 ECMA standard . 你可以从今天开始使用 babel 7 和第三阶段预设。见 babel REPL example .
|
![]() |
2
250
简而言之,不,es6类不支持私有属性。 但是,您可以模仿这种行为,不将新属性附加到对象,而是将它们保留在类构造函数中,并使用getter和setter来访问隐藏的属性。注意,getter和setter在类的每个新实例上都被重新定义。 小精灵
ES5
|
![]() |
3
177
关于@loganfsmyth的回答: javascript中唯一真正私有的数据仍然是作用域变量。不能以与公共属性相同的方式在内部访问属性的方式拥有私有属性,但可以使用范围变量存储私有数据。 作用域变量这里的方法是使用构造函数的作用域(私有)来存储私有数据。要使方法能够访问这个私有数据,它们也必须在构造函数中创建,这意味着您要用每个实例重新创建它们。这是一个性能和内存的惩罚,但有些人认为这个惩罚是可以接受的。对于不需要访问私有数据的方法,可以像往常一样将它们添加到原型中,从而避免惩罚。 例子:
瞄准镜织布工
weakmap可以用来避免前面方法的性能和内存损失。weakmap将数据与对象(这里是实例)关联起来,这样只能使用该weakmap访问数据。因此,我们使用作用域变量方法创建一个私有weakmap,然后使用该weakmap检索与
例子:
本例使用一个对象将一个编织器用于多个私有属性;您也可以使用多个编织器并像
从理论上讲,这种方法的隐私可能会被篡改全球
(这种方法也可以用
半答案:范围符号
符号是一种可以用作属性名的基元值类型。可以使用作用域变量方法创建私有符号,然后将私有数据存储在
此方法的隐私可能会被使用
例子:
半答案:下划线旧的默认设置是,只使用带有下划线前缀的公共属性。尽管在任何方面都不是私有属性,但这种约定非常流行,它可以很好地进行通信,读者应该将该属性视为私有属性,这通常可以完成任务。作为这个失误的交换,我们得到了一个更容易阅读,更容易打字,更快的方法。 例子:
结论截至2017年年底,私人房产仍然没有完美的方式。各种方法各有利弊。作用域变量是真正的私有变量;作用域weakmaps是非常私有的,比作用域变量更实用;作用域符号是相当私有的,也相当实用;下划线通常足够私有,也非常实用。 |
![]() |
4
114
更新:A proposal with nicer syntax 正在路上。欢迎捐款。
是的,对象中有-用于作用域访问-
ES6 introduces
符号是唯一的,除了反射之外,你不能从外部获得一个(如爪哇/ C中的私人),但是任何有权访问内部符号的人都可以使用它来进行密钥访问:
|
![]() |
5
30
答案是“不”。但是,您可以创建对属性的私有访问,如下所示:
(在早期版本的ES6规范中,使用符号确保隐私的建议是正确的,但现在不再是这样了: https://mail.mozilla.org/pipermail/es-discuss/2014-January/035604.html 和 https://stackoverflow.com/a/22280202/1282216 . 有关符号和隐私的详细讨论,请参见: https://curiosity-driven.org/private-properties-in-javascript ) |
![]() |
6
27
在js中获得真正隐私的唯一方法是通过作用域,因此没有方法拥有属于
很明显这是一个可能很慢,肯定很难看,但它确实提供了隐私。 请记住,即使这样也不是完美的,因为javascript是如此动态。有人还可以
要在存储值时捕获这些值,因此如果希望格外小心,则需要捕获对
|
![]() |
7
22
为了以后供其他旁观者参考,我听说现在的建议是 WeakMaps 保存私人数据。 下面是一个更清楚的工作示例:
|
![]() |
8
12
取决于 whom you ask -)
不
但是,可能有 support for private names ,这确实允许私有属性,而且它们可能也可以用于类定义中。 |
![]() |
9
9
完成@d13和@johnny oshika和@danyalaytekin的评论:
我想在@johnny oshika提供的示例中,我们可以使用普通函数而不是箭头函数,然后
JS
MIN JS
我能想到的好处是:
我可以想到一些缺点:
可以在以下位置找到正在运行的代码段: http://www.webpackbin.com/NJgI5J8lZ |
![]() |
10
9
使用es6模块(最初由@d13提出)对我很好。它并没有完美地模拟私有属性,但至少您可以确信应该私有的属性不会泄漏到类之外。下面是一个例子: JS
那么消费代码可以如下所示:
更新(重要):正如@danyalaytekin在评论中所概述的,这些私有属性是静态的,因此在范围上是全局的。在使用单例对象时,它们会很好地工作,但是必须注意瞬态对象。扩展上面的示例:
|
![]() |
11
8
是-可以创建封装的属性 ,但它没有使用访问修饰符(public private)完成,至少没有使用es6。 下面是一个简单的使用ES6的示例: 1使用创建类 class 单词 2在它的构造函数中使用 let 或 const 保留字->因为它们是块作用域,所以不能从外部访问(封装)
3若要允许对这些变量进行某些访问控制(setters getter),可以使用以下方法在其构造函数中声明实例方法:
现在让我们检查一下:
|
![]() |
12
7
对“私人”的不同看法
我决定采用一种更实用的方法,如果您的ide支持jsdoc(例如webtorm),那么这种方法就可以很好地解决es6中目前无法提供私有可见性的问题。我们的想法是使用
|
![]() |
13
6
弱映射
首先,定义一个函数来包装weakmap:
然后,在类之外构造一个引用:
注: 班 IE11不支持,但在示例中看起来更清晰。 |
![]() |
14
4
我相信在构造函数中使用闭包可以“两全其美”。有两种变体: 所有数据成员都是私有的
有些成员是私人的 注:这是公认的丑陋。如果您知道更好的解决方案,请编辑此答复。
|
![]() |
15
4
事实上,使用符号和代理是可能的。在类作用域中使用符号并在代理中设置两个陷阱:一个用于类原型,以便reflect.ownkeys(实例)或object.getownpropertysymbols不会泄漏符号,另一个用于构造函数本身,因此当
|
![]() |
16
4
就我个人而言,我喜欢
bind operator
还有一个更难的解决方案,这里没有提到,下面是更实用的方法,允许它在类中拥有所有私有的道具/方法。 私家侦探
JS
如有意见,将不胜感激。 |
![]() |
17
4
我想 Benjamin's answer 在语言本机支持显式私有变量之前,可能是大多数情况下的最佳选择。
但是,如果出于某种原因,您需要阻止
与使用
|
![]() |
18
4
我是在寻找“班级专用数据”的最佳实践时发现这篇文章的。有人提到一些模式会有性能问题。 我根据在线书籍“Exploring ES6”中的4种主要模式整理了几个JSPerf测试: http://exploringjs.com/es6/ch_classes.html#sec_private-data-for-classes 测试可在以下位置找到: https://jsperf.com/private-data-for-classes 在chrome 63.0.3239/macosx10.11.6中,性能最好的模式是“通过构造函数环境的私有数据”和“通过命名约定的私有数据”。对我来说,Safari在Weakmap的表现很好,但Chrome的表现不太好。 我不知道对内存的影响,但是“构造函数环境”的模式(有些人警告说这是一个性能问题)的性能非常好。 四种基本模式是: 通过构造函数环境的私有数据
通过构造函数环境的私有数据2
通过命名约定的私有数据
通过weakmaps的私有数据
通过符号的私有数据
|
![]() |
19
3
|
![]() |
20
3
连打字本都做不到。从他们 documentation :
但是他们的 playground 这给出:
所以他们的“私有”关键字是无效的。 |
![]() |
21
3
很晚才来参加派对,但我在搜索时碰到了操作问题,所以… 是的,可以通过在闭包中包装类声明来拥有私有属性
有一个例子说明了我在
this codepen
. 在下面的代码片段中,subscribable类有两个“private”函数
我喜欢这种方法,因为它能很好地分离关注点,并将事情真正保密。唯一的缺点是需要使用“self”(或类似的东西)在私有内容中引用“this”。 |
![]() |
22
3
哦,这么多奇异的解决方案!我通常不关心隐私,所以我用 “伪隐私” 正如它的 said here . 但如果真的在意(如果有一些特殊要求),我会在这个例子中使用类似的东西:
函数(构造函数)的另一种可能实现
|
![]() |
23
2
见 this answer 一个干净简单的“类”解决方案,具有私有和公共接口,并支持组合 |
![]() |
24
2
是的,完全可以,而且很容易。这是通过在构造函数中返回原型对象图来公开私有变量和函数来完成的。这不是什么新鲜事,但需要一点js foo来理解它的优雅。这种方式不使用全局作用域或编织器。它是语言中的一种反映形式。取决于如何利用它;可以强制异常中断调用堆栈,也可以将异常作为
|
![]() |
25
2
我找到了一个非常简单的解决方案
|
![]() |
26
2
我用这个模式,它一直对我有效
|
![]() |
27
2
实际上它
是
可能的。
|
|
28
2
你可以试试这个 https://www.npmjs.com/package/private-members 此包将按实例保存成员。
|
![]() |
29
1
大多数答案要么说这是不可能的,要么要求你使用一个编织工或符号,这是ES6的功能,可能需要多填充。不过,还有别的办法!看看这个:
我叫这个方法 存取器模式 . 基本的想法是我们有一个 关闭 A 钥匙 在闭包中,我们创建一个 私有对象 (在构造函数中)只有在 钥匙 . 如果你感兴趣,你可以在 my article . 使用此方法,可以创建在闭包外部无法访问的每对象属性。因此,您可以在构造函数或原型中使用它们,但不能在其他任何地方使用它们。我没见过这种方法在任何地方使用,但我认为它非常强大。 |
![]() |
30
1
另一种类似于最后两篇文章的方式
|
![]() |
Softly · 单选按钮未按预期取值 1 年前 |
|
SlickRed · 我无法使用JS关注HTML元素 1 年前 |
![]() |
assembler · Nextjs没有处理发布请求 1 年前 |
|
BADRUM · 执行两个获取功能后,如何导航回页面? 1 年前 |
![]() |
Toniq · javascript为php保存多维数组 1 年前 |