在JSON.stringify期间获取原型中定义的动态属性

时间:2015-05-03 19:17:47

标签: javascript prototype prototypal-inheritance

我已经在原型对象中定义了一个可枚举的属性,并希望在将原型对象转换为JSON时出现它。

我的第一个想法是将它设置为toJSON,但因为我不想在事后将它保留在对象中,我将不得不或多或少地克隆函数中的整个对象并设置必要的属性。

重新定义目标对象中的属性并仅使用当前对象的上下文进行代理似乎也不是一个选项,因为我无法真正使用apply或{{ 1}}获取动态属性时。

到目前为止我能提出的工作解决方案似乎需要相当多的代码并且不够灵活和简洁,所以我想知道是否有任何解决此任务的最佳实践。< / p>

这是一个看起来有点合成的例子,但我相信仍然传达了这个想法:

call

1 个答案:

答案 0 :(得分:2)

  

我必须或多或少地克隆函数中的整个对象并设置必要的属性。

是的,这并没有错。这就是.toJSON应该起作用的方式:

ProjectFolder.prototype.toJSON = function toJSON() {
    var obj = {};
    for (var p in this) // all enumerable properties, including inherited ones
        obj[p] = this[p];
    return obj;
};

但是,我还想提出另外两点:

  • 当已经以size数组的长度编码时,文件夹的files实际上不需要单独存储在JSON中。这种冗余数据似乎是多余的,并且可能会混淆反序列化。除非某些内容需要此属性,否则我建议您省略它。
  • ProjectFolder中,.size是每个实例的自有属性 - 在GithubProjectFolder中它不是。这表明you're doing inheritance wrong。更好:

    function GithubProjectFolder() {
      ProjectFolder.call(this);
      this.files.puhs('.gitignore', 'README.md');
    }
    GithubProjectFolder.prototype = Object.create(ProjectFolder.prototype);
    

    如果您单独解决此问题,size将会显示在project的序列化中。