Typescript - преимущества сеттеров / геттеров? - PullRequest
0 голосов
/ 06 сентября 2018

Я бэкэнд-разработчик, который разрабатывал в основном на Java, поэтому меня научили использовать сеттеры / геттеры вместо прямого доступа к свойствам класса.

Теперь я попадаю в мир внешнего интерфейса и теперь попал в JS / TS. Я видел, как многие люди обращались к объектным переменным напрямую, без использования сеттеров и геттеров, как в Java, например this.person.name.

Почему это? Есть ли какое-то преимущество в использовании getter / setter для ts и js, если вам не нужно добавлять дополнительный код, а просто получить значение или установить его?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

@ Пойнти неправильно говорит: это действительно хорошая идея, чтобы забыть все о Java при изучении JavaScript . Инкапсуляция - это объектно-ориентированный принцип, скрывающий внутреннее состояние и поведение объекта, что делает ваш код более понятным.

В javascript вы заставляете вещи работать без / грязной структуры. Typescript - это расширенный набор javascript, этот парень - ваш друг, если вы программист на C #, Java или любом другом объектно-ориентированном языке.

Пример:
в миобъекте. Ц

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);
   }
}

Давайте использовать его в основном. 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 и intellisense:
enter image description here

с помощью intellisense в vscode вы видите, что оно не показывает приватное свойство _z и приватную функцию clog ().

Я предлагаю вам посмотреть этот урок и придумать лучшую идею. Link

?

0 голосов
/ 06 сентября 2018

Разница между использованием метода получения или установки и непосредственного доступа к переменным объекта заключается в том, что методы получения / установки автоматически вызываются при назначении. Таким образом, это выглядит как обычное свойство, но за кулисами у вас может быть дополнительная логика (или проверки) для запуска непосредственно перед или после назначения.

Таким образом, если вы решите добавить этот вид дополнительной логики в одно из существующих свойств объекта, на которое уже есть ссылки, вы можете преобразовать его в стиль получения / установки без изменения остальной части кода, имеющего доступ к этому свойству.

let person = {
    _age: 50,

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

  };
...