[Symbols.serialize]()在这做什么?

时间:2018-01-18 13:25:16

标签: javascript ecmascript-6

我看到了这段代码:

// main.js
const Symbols = require('../symbols');

[Symbols.serialize]() {
  ...
  return super[Symbols.serialize]();
}


// symbols.js
module.exports = {
   serialize: Symbol('serialize')
};

我正在慢慢得到ES6,但这一件事让我感到安慰。它实际上做了什么?

2 个答案:

答案 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