我看到以下代码:
// main.js
const Symbols = require('../symbols');
[Symbols.serialize]() {
...
return super[Symbols.serialize]();
}
// symbols.js
module.exports = {
serialize: Symbol('serialize')
};
我正在慢慢获得ES6,但是这一件事使我无所适从。它实际上是做什么的?
最佳答案
您可以先阅读以下内容: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]
,这就是您所看到的。关于javascript - [Symbols.serialize]()在这里做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48322466/