Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular2-只读属性_Angular_Typescript_Oop - Fatal编程技术网

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应用程序中都没有看到这种编码风格。它不仅难

在OOP中,我被教导,对象应该只通过getter暴露其成员,而不应该允许直接变异

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

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

  addTodo(todo: string) {
    this.todos.push({
      text: todo
    });
  }
}
我在任何Angular2应用程序中都没有看到这种编码风格。它不仅难看,而且在更改检测方面也很慢(在每次“mousemove”事件后触发
JSON.parse(JSON.stringify(object)
),所以显然我做错了什么

我的问题是:

  • 是否有更优雅的方式从外部实现只读行为
    MyService

  • 为什么在Angular2中没有像在Java/C#/PHP等其他OOP语言中那样关注隐藏不必要的逻辑


  • 我们为属性设置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

    有关您的答案的问题:

  • 您可以使用public get和private set

  • 这并不是事实。你可以将一个成员设置为private来隐藏它


  • 为什么要克隆
    \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) {
      }
    }