Сеттеры в Javascript

Я хочу заблокировать присвоение свойств только функцией имени набора, потому что я хочу предварительно выполнить форматирование или проверку, посмотрите пример:

class Animal {
    construct(name){
    this.name = name;
    return this;
  }

  setName(name){
    this.name = name;
  }

  getName(){
    return this.name;
  }
}


class Dog extends Animal {

    constructor(name){
    super(name);
    return this;
  }

  setName(name){
    this.name = name.charAt(0).toUpperCase() + name.slice(1);
  }
}

const dog = new Dog();

dog.setName('joe');
console.log(dog.getName()); //Joe

dog.name = 'Bill'; // I wish this type of assignment would not work
console.log(dog.getName()); //Bill

Можно это сделать или что-то подобное?


person 1fabiopereira    schedule 15.02.2017    source источник


Ответы (3)


Вы не можете заблокировать его на 100%, но есть синтаксис установщика:

class Foo {
  constructor(x) {
    this.x = x;
  }

  set x(newX) {
    this._x = newX.charAt(0).toUpperCase() + newX.slice(1);
  }

  get x() {
    return this._x;
  }
}

const foo = new Foo('hello');
console.log(foo.x); // Hello
foo.x = 'goodbye';
console.log(foo.x); // Goodbye

Честно говоря, я бы использовал эту логику для получателя, а не для сеттера. Обычно вы делаете эти косметические вещи на выходе, а не на входе.

Обратите внимание, что это по-прежнему не мешает вашему потребителю редактировать foo._x, в JavaScript нет частных переменных.

person Madara's Ghost    schedule 15.02.2017

Это действительно возможно!

Если вы посмотрите на страницу mdn для набора, вы получите несколько полезных подсказок, как решить вашу проблему.

Общая суть в том, что вы можете определить set propName как функцию, для которой установлено новое значение, и внутри этой функции вы можете применить любое преобразование!

person towc    schedule 15.02.2017

Вы можете определить методы доступа, но не можете иметь их вместе со значениями. Документация Mozilla:

Невозможно одновременно связать геттер со свойством и заставить это свойство фактически содержать значение.

Я уже ответил на это с помощью примера для массивов.

person ceving    schedule 15.02.2017