我看到以下代码:

// 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/

10-11 15:39