是否可以在ES6类中创建私有属性?
这是一个例子.我怎样才能阻止访问instance.property?
class Something {
constructor(){
this.property = "test";
}
}
var instance = new Something();
console.log(instance.property); //=> "test"
Run Code Online (Sandbox Code Playgroud) 我正在用Javascript重建一个旧的Java项目,并意识到在JS中没有好的方法来做枚举.
我能想到的最好的是:
const Colors = {
RED: Symbol("red"),
BLUE: Symbol("blue"),
GREEN: Symbol("green")
};
Object.freeze(Colors);
Run Code Online (Sandbox Code Playgroud)
的const保持Colors被重新分配,并冷冻它防止突变的键和值.我正在使用符号,这Colors.RED是不等于0,或除了它自己之外的任何其他东西.
这个配方有问题吗?有没有更好的办法?
(我知道这个问题有点重复,但以前的Q/As都很老了,ES6给了我们一些新功能.)
编辑:
另一个解决序列化问题的解决方案,但我认为仍存在领域问题:
const enumValue = (name) => Object.freeze({toString: () => name});
const Colors = Object.freeze({
RED: enumValue("Colors.RED"),
BLUE: enumValue("Colors.BLUE"),
GREEN: enumValue("Colors.GREEN")
});
Run Code Online (Sandbox Code Playgroud)
通过使用对象引用作为值,可以获得与Symbols相同的冲突避免.
在ES6中,属性可以定义为符号属性:
var symbol = Symbol();
var object = {};
object[symbol] = 'value';
Run Code Online (Sandbox Code Playgroud)
MDN将可枚举属性定义为"可以通过for..in循环迭代的属性"(1).符号属性永远不会被for ... in循环迭代,因此它们可以被认为是不可枚举的(2).
那么,你能做到这一点是否有意义:
Object.defineProperty(object, symbol, {
value: 'value',
enumerable: true
});
Run Code Online (Sandbox Code Playgroud)
并且查询对象的描述符确实确认了这个属性是可枚举的:
Object.getOwnPropertyDescriptor(object, symbol)
// -> { enumerable: true }
Run Code Online (Sandbox Code Playgroud)
为什么?这有什么用?
(1)https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties
(2)for ... in uses [[Enumerate]],仅包含字符串键.由于我们有符号属性,因此可能应该更改MDN上的定义.
我只是偶然在JavaScript中,新的(建议ES6,但在Firefox,Chrome和歌剧已经实施)数据类型的文档时Symbol:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol http://people.mozilla.org/~jorendorff/es6-draft.html#sec-symbol-objects
我正在读它,但我想不出可能的使用场景.
文件说:
符号是唯一且不可变的数据类型,可用作对象属性的标识符.
好的,好吧,假设我按照文档说的那样做:
obj[Symbol("a")] = "a";
Run Code Online (Sandbox Code Playgroud)
但是,因为符号('a')总是返回唯一值(对象),并且:
迭代中的符号在...中不可见.
我如何从中检索我的财产obj?
var obj = { normalProperty: 'just a string' };
obj[Symbol('a')] = 'a';
document.getElementById('retrieve').addEventListener('click', function() {
document.write('Stringified object:' + JSON.stringify(obj) + '<br/><br/>');
document.write('Trying to get Symbol-property value, aaaand...: <br/>');
document.write(obj[Symbol('a')]); // undefined
}, false);Run Code Online (Sandbox Code Playgroud)
<button id="retrieve">Retrieve obj's property</button>Run Code Online (Sandbox Code Playgroud)
当然,您可以像这样检索它:
var x = Symbol('a');
obj[x] = 'a';
obj[x]; // "a"
Run Code Online (Sandbox Code Playgroud)
但这样做的目的是什么?
提前致谢 :)
新的原始类型带有符号类型的ES6.简短定义说:
符号是唯一且不可变的数据类型,可用作对象属性的标识符.符号对象是符号基元数据类型的隐式对象包装器.
我做了一些研究,但我无法理解为什么我们需要这种原始类型呢?
谢谢您的回答.
ECMA-262-v6中"符号"类型的含义是什么?对象键的快速路径实现?它在引擎盖下做了什么 - 哈希它保证底层数据是不可变的?
我正在学习 JavaScript 符号,根据我所读到的内容,它们用于保护对象属性键覆盖。在下面的代码中,我创建了两个具有相同变量名的符号并将它们用作对象键。我想知道如何访问分配给程序底部的任一“符号”键的数据。如果我完全误解了符号的用途,请指出。
var id = Symbol("my id"); // Create a Symbol
var user = {
name:"Bob",
age:30,
[id]:"my id 12345" // Use it as a property key and add some data
}
var id = Symbol("my different id"); // Create a new Symbol
user[id] = "my different id 9876" // Assign it with some new data
console.log(user);
/* The object contains both symbols. No overwrites!
{
name: "Bob",
age: 30,
Symbol(my id): "my id 12345",
Symbol(my different …Run Code Online (Sandbox Code Playgroud) JS ES6 中有注册表符号这样的东西(可在这篇 Mozilla 文章中找到)。
它与Symbol()(有关 Stack Overflow 的相关问题)不同,可以通过Symbol.for(data).
打电话
Symbol.for(string)。这将访问一组称为符号注册表的现有符号。与由 定义的唯一符号不同Symbol(),符号注册表中的符号是共享的。如果你调用Symbol.for("cat")三十次,它每次都会返回相同的符号。当多个网页或同一网页中的多个模块需要共享一个符号时,注册表非常有用。
我一直在搜索关于这个主题的信息,我在 Stack Overflow 上读过类似的问题(有什么是“全局符号注册表”?但它没有涵盖这个问题 - 为什么使用注册表符号而不是字符串)。
尽管我似乎已经获得了(几乎)关于用 定义的唯一符号的所有信息Symbol(),但注册表符号 ( Symbol.for()) 对我来说根本没有多大意义。
我的意思是,看看那里的例子:
Symbol.for('foo'); // create a new global symbol
Symbol.for('foo'); // retrieve the already created symbol
// Same global symbol, but not locally
Symbol.for('bar') === Symbol.for('bar'); // true
//ADDED BY ME
Symbol.for('far') === Symbol.for('bar'); …Run Code Online (Sandbox Code Playgroud) 在javascript(ECMASCRIPT6)中使用Symbol有什么用?
为什么以下示例返回false?
const symbol1 = Symbol();
console.log(Symbol('foo') === Symbol('foo'));
// expected output: false
javascript ×9
ecmascript-6 ×8
symbols ×7
class ×1
enums ×1
es2015 ×1
immutability ×1
ruby ×1
types ×1