Является ли хорошей практикой в Javascript использовать функции как C #-подобные свойства для доступа к частным данным?

#javascript

#javascript

Вопрос:

Например, рассмотрим класс Obj, который имеет переменные данных a и b и средства доступа к ним, A () и B():

 class Obj 
{
    constructor () 
    {
         this.a = 5
         this.b = 9 
    }

    A () { return a }
    SetA ( value ) { this.a = value }
    B () { return b }
}
  

Идея состоит в том, чтобы отделить интерфейс от реализации, чтобы сделать код более гибким для будущих изменений. Итак, если вы измените что-то в переменных a и b, вам не нужно изменять весь код, который их использует.

Но я боюсь, что это может привести к большим накладным расходам, потому что это не было бы оптимизировано, как в других языках. Кроме того, функции являются гражданами первого класса в Javascript, поэтому вызывать их сложно.

Хорошая ли идея обращаться к данным подобным этому? Или этого следует избегать и как?

Комментарии:

1. Если вы когда-нибудь решите, что вам понадобятся установщики позже, вы можете прозрачно перейти к set a(val) { ... }

Ответ №1:

Хорошая ли идея обращаться к данным подобным этому?

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

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

 { example: "test", }
// can be turned into
{ 
  get example() { /*..*/ },
  set example(v) { /*...*/ },
 }
  

Насколько я вижу, то же самое относится и к C#:

  string example
 // can be turned to
 string example {
   get {
     //...
   }
 }
  

поэтому я не уверен, о каких «лучших практиках» вы говорите.

… если вы измените что-то в переменных a и b, вам не нужно изменять весь код, который их использует.

Но … если эти свойства изменяются таким образом, что это влияет на их функциональность, код, использующий их, также должен быть изменен, использование геттеров / установщиков, чтобы «заставить это все еще как-то работать», не является долгосрочным решением.

Ответ №2:

Нет, вы не должны писать методы доступа в JavaScript. Они вам не нужны сейчас и не понадобятся в будущем. Сохраняйте свой код простым.

 class Obj {
    constructor() {
        this.a = 5
        this.b = 9 
    }
}
  

сделайте код более гибким для будущих изменений.

JavaScript поддерживает свойства getter и setter. Средство доступа не обязательно должно быть методом, оно работает с обычным синтаксисом свойств (как доступ, так и назначение). Если вы позже измените свои свойства данных на свойства accessor, код, использующий их, не нужно будет перенимать.

 class Obj {
    constructor() {
        this.a = 5 
    }
    get b() {
        return this.a   4;
    }
    set b(val) {
        this.a = val - 4;
    }
}
const inst = new Obj;
console.log(inst.a, inst.b);
inst.b = 46;
console.log(inst.a, inst.b);