【问题标题】:Typescript - What is better: Get / Set properties打字稿 - 更好的是:获取/设置属性
【发布时间】:2018-08-09 17:20:33
【问题描述】:

最近刚刚发现关于对类属性使用 get 和 set 关键字我想知道在 typescript 类中使用 get/set 时的首选方法是什么:

class example {
    private a: any;
    private b: any;

    getA(): any{
        return this.a;
    }

    setA(value: any){
        this.a = value;
    }

    get b(): any{
        return this.b;
    }

    set b(value: any){
        this.b = value;
    }
}

我只是好奇是否有任何最佳实践、性能或其他因素。

【问题讨论】:

  • 当你想要验证值时,你使用 get 和 set 方法。这种方式很好https://www.typescriptlang.org/docs/handbook/classes.html 我觉得Accesors说得很清楚了
  • 这样做有什么意义吗?在那些 getter/setter 中没有业务逻辑,它使代码混乱,使其更难维护。使用 getter/setter 会对性能产生一些影响。问题是,你想用这个封装什么?
  • @12seconds:我只是问我是否应该只使用'getProperty()'或'get property()'和简单的例子。
  • 我来自 OOP 背景,理想情况下你想说出什么是有意义的。例如,做Car.getModelCar.Model 有意义吗?对我来说,我会选择Car.Model。所以这个问题真的是基于意见的。对此没有真正的答案。
  • 喜欢 get/set 版本的一个原因是它允许使用双向数据绑定:[(ngModel)]="b"。使用这些方法,您必须将其拆分为:[ngModel]="getA()" (ngModelChange)="setA($event)"。请注意,您的变量名称应与属性名称不同(例如private _b)。

标签: angular typescript oop


【解决方案1】:

Getter 和 Setter 有多种用途,例如

如果不指定 setter,则可以将私有变量设为只读

class example {
    private _a: any;

    get a(): any{
        return this._a;
    }
}

当变量发生变化时,您可以使用它们来执行自定义逻辑,类似于 Event Emitter 的替代品

class example {
    private _a: any;

    set a(value: any){
        this._a = value;

        // Let the world know, I have changed
        this.someMethod();
    }

    someMethod() {
        // Possibly a POST API call
    }
}

您可以使用它们为输出设置别名

class Hero {
    private _health: any = 90;

    get health(): string {
        if(this._health >= 50) {
            return "I am doing great!";
        } else {
            return "I don't think, I'll last any longer";
        }
    }
}

setter 可用于干净的赋值

class Hero {
    private _a: number;

    set a(val: number) {
        this._a = val;
    }

    setA(val: number) {
        this._a = val;
    }

    constructor() {
        this.a = 30;    // Looks cleaner
        this.setA(50);  // Looks Shabby, Method's purpose is to perform a logic not handle just assignments
    }
}

最后,setter 最大的优势是能够在赋值之前检查变量的正确值

class Hero {
    private _age: number;

    set age(age: number) {
        if (age > 0 && age < 100) {
            this._age = age
        } else {
            throw SomeError; 
        }
    }
}

【讨论】:

  • 但是您可以使用 getAge 的 setAge 并保留 get 和 set 关键字来完成所有这些操作。我有 Java 背景,很想知道使用关键字是否有好处。对我来说 .getHealth() 比 .health() 更熟悉、更清晰。我认为 .health() 应该返回实际值,我会编写另一个函数,例如 getHealthInformation() 并让该函数返回字符串消息。只是我的看法,可能是完全错误的:D
  • @Jdruwe 使用传统 Java 风格的 getter 和 setter 的一个潜在原因是在发送 JavaScript 对象的字符串化版本时(可能来自快速驱动的 REST API)。这样的对象将丢失对任何其他对象和函数(包括 get 和 set 方法)的引用,并且它的属性都将以 _ 为前缀;例如_id_name。如果我们使用 setIdgetName 等,我们的字符串化 JS 对象的属性将没有下划线前缀(除非这是我们想要的)。
猜你喜欢
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多