gpt4 book ai didi

javascript - 在 JSON.stringify 期间获取原型(prototype)中定义的动态属性

转载 作者:行者123 更新时间:2023-11-30 16:54:05 25 4
gpt4 key购买 nike

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

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

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

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

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

function ProjectFolder() {
this.files = [];
Object.defineProperty(this, 'size', {enumerable: true, get: function() {
return this.files.length;
}});
}

function GithubProjectFolder() {
this.files = ['.gitignore', 'README.md'];
}
GithubProjectFolder.prototype = new ProjectFolder();

var project1 = new ProjectFolder();
JSON.stringify(project1);
// output: {"files":[],"size":0}
// size is present

var project = new GithubProjectFolder();
JSON.stringify(project);
// output: {"files":[".gitignore","README.md"]}
// size is absent

最佳答案

I'll have to more or less clone the whole object in the function and set the necessary property.

是的,这没有任何问题。这就是 .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;
};

不过,还有两点我想说明:

  • 当文件夹的大小 已经编码为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);

    如果您单独解决这个问题,大小 将出现在您的项目 的序列化中。

关于javascript - 在 JSON.stringify 期间获取原型(prototype)中定义的动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com