Angular2 – 只读属性

在OOP中,我被告知你的对象应该只通过吸气剂暴露他们的成员,并且永远不应该允许直接变异.

看一些Angular2应用程序,我总是看到这个概念被违反了.

export class TodoService {
  todos: Array<TodoData> = [];

  addTodo(todo: string) {
    this.todos.push({
      text: todo
    });
  }
}

在上面的代码中,不能保证不会以addTodo方法之外的方式添加待办事项(例如,调用todoService.todos.push({text:”})或甚至覆盖整个todos数组).

我总是试图消除这些违规可能性,这使我的服务看起来像这样:

export class MyService {
  private _myPrimitive: boolean;
  get myPrimitive(): { return this._myPrimitive; }

  private _myArray: Array<number>;
  get myArray(): Array<number> { return this._myArray.splice(0); }

  private _myObject: MyObject;
  getMyObject(): MyObject { return JSON.parse(JSON.stringify(this._myObject)); }

  private _onMyEvent = new Subject<Event>();
  get onMyEvent: Observable<Event> { return this._onMyEvent.asObservable(); }
}

我没有在任何Angular2应用程序中看到这种编码风格.它不仅仅是丑陋的,它在变化检测方面也很慢(在每次’mousemove’事件之后触发JSON.parse(JSON.stringify(对象)非常昂贵)所以显然我做错了.

我的问题是:

>是否有更优雅的方法可以从MyService外部实现只读行为.
>为什么没有关注隐藏Angular2中不必要的逻辑而不是其他OOP语言(如Java / C#/ PHP).

最佳答案 我们为属性设置getter / setter的原因是OOP Open / Close原则.例如在Java中我有一个类Student,如下所示:

class Student { 
  public: 
    int age;
}

如果我把这个年龄公之于众.稍后如果有要求添加年龄应小于100的约束,我必须搜索我的所有程序以检查年龄分配.

在Typescript中你可以这样写:

class Student {
  age: number
}

稍后您可以通过添加getter或setter来仅修改Student类.

class Student {
  get age() {
  }
  set age(value: number) {
  }
}

当你使用student.age = 15时,它会调用set age.无需更改外部代码.因此,默认情况下,您不需要编写getter / setter.

如果您对答案有疑问:

>您可以使用公共获取和私有集.
>那个意见不是事实.您始终可以在private下设置成员以将其从外部隐藏.

点赞