【问题标题】:Typescript - Advantages of Setters/Getters?Typescript - Setter/Getter 的优点?
【发布时间】:2018-09-06 13:37:34
【问题描述】:

我是一名后端开发人员,主要使用 Java 进行开发,因此我被教导使用 setter/getter,而不是直接访问类的属性。

现在我正在进入前端世界,现在进入 js/ts。我见过很多人直接访问对象变量,而无需像在 Java 中那样使用 setter 和 getter,例如 this.person.name

这是为什么?如果您不需要添加额外的代码而只是为了获取值或设置它,那么在 ts 和 js 上使用 getter/setter 是否有任何优势?

谢谢。

【问题讨论】:

  • 个人观点:我认为两种语言最大的区别在于心态。正如您可能知道的那样,Java 对做事的“正确方式”完全是强迫症,通常会强迫您这样做。 Javascript 往往更像是一种时髦的牛仔语言。只需进入并使其工作。此外,在 Java 更易于长期维护的情况下,JavaScript 似乎更一次性。 (同样,这些是更多的观察而不是可衡量的事实。)

标签: javascript typescript setter getter


【解决方案1】:

使用 getter 或 setter 与直接访问对象变量的区别在于 getter/setter 在赋值时会自动调用。所以它看起来就像一个普通的属性,但在幕后你可以在赋值之前或之后运行额外的逻辑(或检查)。

因此,如果您决定将这种额外逻辑添加到已具有引用的现有对象属性之一,则可以将其转换为 getter/setter 样式,而无需更改有权访问该属性的其余代码。

let person = {
    _age: 50,

    set age(newage){
      if(typeof newage === 'number'){
           this._age = newage;
            console.log('valid input')
      }
      else{
           console.log ('Invalid input');
      }
    }

  };

【讨论】:

  • 所以唯一的好处是在函数中添加更多代码?与安全或其他无关?
  • 你不能在javascript中使用'public'和'private'关键字,但是如果你想要私有属性,你可以使用局部变量
  • @Wrong 优点:1. 封装 2. 灵活性;缺点:性能。类似的东西。
【解决方案2】:

@Pointy 的说法是错误的:在学习 JavaScript 时忘记所有关于 Java 的内容确实是个好主意。封装是一种面向对象的原则,它隐藏了对象的内部状态和行为,使您的代码更易于维护。

在 javascript 中,您可以让 tings 使用无/杂乱的结构。 Typescript 是 javascript 的超集,如果你是 C#、Java 或任何其他面向对象的语言程序员,这家伙是你的朋友。

示例:
在我的对象中。Ts

export class MyObject {

   // private property
   private _x: number;
   private _z: number;

   // public property
   y: number;

   constructor(private _d?: number) {
       this._x = 0;
       this.y = 0;
       this._z = 0;

       this.clog(_d)
   }

   // access modifier only for _x
   get x() {
       return this._x;
   }
   set x(value: number) {
       this._x = value;
   }

   private clog(d: number) { 
       console.log(d);
   }

   // arrow function -> public
   testf = () => { console.log('value of this._d' , this._d); }
}

然后你进入 myobject.js 这个:

export class MyObject {
   constructor(_d) {
       this._d = _d;
       // arrow function -> public
       this.testf = () => { console.log('value of this._d', this._d); };
       this._x = 0;
       this.y = 0;
       this.clog(_d);
   }
   // access modifier
   get x() {
       return this._x;
   }
   set x(value) {
       this._x = value;
   }
   clog(d) {
       console.log(d);
   }
}

让我们在 main.Ts 中使用它:

import { MyObject } from './myobject';

let mo = new MyObject(15);

// set a value to the private property x
mo.x = 5;

// get the value of the private property x
// output 5
console.log(mo.x);

vscode 和智能感知:

在 vscode 中使用智能感知,您会看到它没有显示私有属性 _z 和私有函数 clog()。

我建议您观看本教程并提出更好的想法。 Link

?

【讨论】:

  • 但是你什么都没封装,真的。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多