相关疑难解决方法(0)

JavaScript ES6类中的私有属性

是否可以在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 class private-members ecmascript-6 es2015

410
推荐指数
17
解决办法
22万
查看次数

使用ES6在Javascript中枚举

我正在用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相同的冲突避免.

javascript enums symbols immutability ecmascript-6

106
推荐指数
8
解决办法
8万
查看次数

何时在Ruby中使用符号而不是字符串?

如果我的脚本中至少有两个相同字符串的实例,我应该使用符号吗?

ruby symbols

94
推荐指数
4
解决办法
4万
查看次数

为什么Object.defineProperty可以使ES6符号属性可枚举?

在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 ecmascript-6

17
推荐指数
2
解决办法
1622
查看次数

新的JavaScript"Symbol"数据类型有哪些可能的使用方案?

我只是偶然在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)

但这样做的目的是什么?

提前致谢 :)

javascript types symbols

16
推荐指数
2
解决办法
1188
查看次数

JavaScript中的"符号"原始数据类型是什么

新的原始类型带有符号类型的ES6.简短定义说:

符号是唯一且不可变的数据类型,可用作对象属性的标识符.符号对象是符号基元数据类型的隐式对象包装器.

我做了一些研究,但我无法理解为什么我们需要这种原始类型呢?

谢谢您的回答.

javascript symbols primitive-types ecmascript-6

9
推荐指数
1
解决办法
6903
查看次数

ECMA-262-v6中"符号"类型的含义是什么?

ECMA-262-v6中"符号"类型的含义是什么?对象键的快速路径实现?它在引擎盖下做了什么 - 哈希它保证底层数据是不可变的?

javascript symbols ecmascript-6

6
推荐指数
1
解决办法
587
查看次数

如何从 JavaScript 中用作对象键的同名符号访问数据

我正在学习 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)

javascript symbols ecmascript-6

5
推荐指数
1
解决办法
2455
查看次数

Javascript ES6 中注册表符号 (Symbol.for) 的用途是什么?

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 ecmascript-6

5
推荐指数
0
解决办法
259
查看次数

在JavaScript ECMAScript 6中使用Symbol有什么用?

在javascript(ECMASCRIPT6)中使用Symbol有什么用?

为什么以下示例返回false?

const symbol1 = Symbol();

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

javascript symbols ecmascript-6

3
推荐指数
2
解决办法
602
查看次数