最近遇到以下难题:
标准
Typescript documentation建议使用带有下划线前缀的私有(private)成员创建对象定义,允许 getter/setter 使用所述成员的原始“名称”,提供间接公共(public)访问(他们应该这样做)。
Angular documentation否则建议,但是没有提供在其对象定义示例中对私有(private)变量使用 getter 和 setter 的示例。
问题
我一直在最大限度地遵循 Typescript 编码标准。以下面的类为例:
public class Foo{
private _bar:string;
constructor(){ this._bar='Baz'; }
get bar():string{return this._bar}
}
使用以下代码将其序列化为JSON:
console.log(JSON.stringify(new Foo()));
...将产生:
{
'_bar': 'Baz'
}
问题
- 考虑到这些只是“指南”和简单的建议,处理对象定义的 Angular 方式是什么,允许直接序列化?
- 在我的示例中,私有(private)访问修饰符肯定不允许直接访问它的值吗?我对此处使用私有(private)访问修饰符的理解遗漏了什么?
我已经阅读了很多关于处理序列化的不同方式的其他文章和 StackOverflow 帖子,想要阻止“如何”,而是针对所提到的行为询问“为什么”。
如有任何反馈,我们将不胜感激! :)
亲切的问候
最佳答案
你可以通过实现toJSON()
来自定义序列化
public class Foo{
private _bar:string;
constructor(){ this._bar='Baz'; }
get bar():string{return this._bar}
toJSON() {
return {bar: _bar};
}
static fromJSON(json) {
...
}
}
另见 http://choly.ca/post/typescript-json/
Getter 和 setter 是纯粹的 TypeScript 语言特性,与 Angular 完全无关。
private
仅用于 TypeScript 中的静态分析。当它被转译为 JS 时,private
将不再存在。它变成了一个普通的旧 JS 对象,JSON.stringify
就这样对待它。
关于Angular 2(或 4)对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44407491/