我看到了这段代码:
// main.js
const Symbols = require('../symbols');
[Symbols.serialize]() {
...
return super[Symbols.serialize]();
}
// symbols.js
module.exports = {
serialize: Symbol('serialize')
};
我正在慢慢得到ES6,但这一件事让我感到安慰。它实际上做了什么?
答案 0 :(得分:2)
您可以先阅读此内容:http://2ality.com/2014/12/es6-symbols.html(尤其是1.1 Symbols as property keys
)
在您的示例中:您在Symbols.serialize
中创建了一个名为symbol.js
的符号,然后使用此符号作为函数名来定义函数。
想象一下[Symbols.serialize]
就像mySerialize
,然后
[Symbols.serialize]() {
...
return super[Symbols.serialize]();
}
就像
function mySerialize() {
...
return super['mySerialize']();
}
(不完全是,仅举例)
MDN参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
然后让我们猜测你的例子中的设计模式。为了简化操作,我将使用mySerialize
作为函数名称而不是[Symbols.serialize]
,您可以认为它们是相同的并执行相同的操作。
作者正在实现一个序列化框架(序列化意味着将对象的所有属性保存为字符串或字节流。反序列化意味着从字符串或字节流中恢复对象)。
每个类都实现自己的mySerialize
函数。在此函数中,此类的属性是序列化的,当然,它们通过调用super['mySerialize']()
来使用超类的属性进行序列化。
class TheDemoBase {
mySerialize() {
return my_serialization_result
}
}
class TheDemoClass extends TheDemoBase {
mySerialize() {
// serialize all properties of `this`
do_serialize(this.a)
do_serialize(this.b)
// call TheDemoBase.mySerialize()
combine_serialization(super['mySerialize']())
return result
}
}
然后,将所有mySerialize
替换为[Symbols.serialize]
,这就是您所看到的内容。
答案 1 :(得分:0)
语法[someVar]() { }
是用于定义具有变量定义名称的函数属性的语法。例如:
var someVar = "foo";
class Foo {
[someVar]() { }
}
var myObj = {
[someVar]() { }
}
这将创建一个类和一个名为foo
的属性的对象,因为那是someVar
当时碰巧保留的内容。
对于[Symbol.serialize]() { ... }
,属性名称恰好是Symbol
值而不是字符串(因为ES6,属性名称可能是字符串,也可能是唯一的Symbol
值) 。 Symbol.serialize
的值恰好是Symbol
生成的Symbol('serialize')
对象,就像我的第一个示例中someVar
的值是字符串"foo"
一样。< / p>
Symbol('serialize')
的输出只是一个唯一符号,内部[[Description]]
广告位设置为字符串serialize
。