Angular2-只读属性
在OOP中,我被教导,对象应该只通过getter暴露其成员,而不应该允许直接变异 看看一些Angular2应用程序,我总是发现这个概念被违反了Angular2-只读属性,angular,typescript,oop,Angular,Typescript,Oop,在OOP中,我被教导,对象应该只通过getter暴露其成员,而不应该允许直接变异 看看一些Angular2应用程序,我总是发现这个概念被违反了 export class TodoService { todos: Array<TodoData> = []; addTodo(todo: string) { this.todos.push({ text: todo }); } } 我在任何Angular2应用程序中都没有看到这种编码风格。它不仅难
export class TodoService {
todos: Array<TodoData> = [];
addTodo(todo: string) {
this.todos.push({
text: todo
});
}
}
我在任何Angular2应用程序中都没有看到这种编码风格。它不仅难看,而且在更改检测方面也很慢(在每次“mousemove”事件后触发JSON.parse(JSON.stringify(object)
),所以显然我做错了什么
我的问题是:
MyService
我们为属性设置getter/setter的原因是OOP打开/关闭原则。例如,在Java中,我有一个学生,如下所示:
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
有关您的答案的问题:
为什么要克隆
\u myObject
?如果它们是以这种方式构建的,那么它们应该是不可变的,不是吗?@GünterZöchbauer没错,您可以构建一个不可变的myObject
,但有时您需要存储具有公共字段的数据。还要注意,不可变性与只读不同(有人仍然可以覆盖myObject
)。通过克隆它,我正在制作一个简单的防御副本()因为我不希望从外部对其进行修改。这样,对象就不会通过公共字段/方法进行修改。您可以在类仅允许使用此生成器修改的情况下使用生成器。只有当您引用此生成器时,才可以更新属性。如果您有大量此类,则可以方便地使用代码生成f抱歉,但是我仍然需要澄清你的第一个答案:正如你在我的问题中看到的,我已经在我的代码中使用了带有私有字段的公共getter,但是这只会使它们在原语时是只读的。如果我返回一个带有getter的对象,我将返回一个引用,因此该对象仍然可以被修改通过公共字段/方法,所以它不是只读的,因此在我的答案中克隆。在克隆对象时,可以引用这个答案:在C++、java、C++中,你必须这样做(克隆)。。对不起,你读过我的问题吗?我已经在使用最有效的克隆方法,以及你在回答中建议的所有其他方法。请参阅第二个代码片段。是的,我读过。1.我解释了默认情况下不需要getter setter的原因。2.回答你的问题:你正在使用最有效的方法。3.解释一下您需要将其他OOP概念保持在角度上。
class Student {
get age() {
}
set age(value: number) {
}
}