Защита свойств объекта от перезаписи с консоли - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь защитить свойство объекта от перезаписи консолью. например У меня есть объект человек со списком аллергий как собственность. Список аллергий должен быть в состоянии изменить, однако он всегда должен быть списком, и следует выдавать ошибку, если пользователь пытается написать 'person.allergies = "nonsense"'

Я пытался изучить Object.freeze () и Object.seal (), но не могу заставить их работать для этой цели, так как я не верю, что есть способ разморозить объект.

class Person {
    constructor(name){
        this.name = name
        this.allergies = []
    }

    addAllergy(allergy){
        this.allergies.push(allergy)
        return allergy
    }
}

ben = new Person('Ben')     //  Creating a new Object
ben.addAllergy('Dairy')     //  Giving the object a new allergy
ben.allergies               //  Should output ['Dairy']
ben.allergies = 'Soy'       //  Should make no changes to ben object.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Использовать частные свойства:

class Person {
    #allergies;

    constructor(name){
        this.name = name
        this.#allergies = []
    }

    addAllergy(allergy){
        this.#allergies.push(allergy)
        return allergy
    }

    get allergies() {
      // you might want to deep clone it here
      // to fully protect from changes the array behind
      return this.#allergies; 
    }

    set allergies(value) {
      throw new Error('haha, I got you!');
    }
}

Частные поля вводятся в стандарте ECMA. Вы можете начните использовать их сегодня с предустановкой babel 7 и stage 3

Источник

0 голосов
/ 05 января 2019

Вы можете сделать allergies недоступным для записи свойством с Object.defineProperty:

class Person {
    constructor(name){
        this.name = name
        Object.defineProperty(this, 'allergies', {
            value: [],
            writable: false
          });
    }

    addAllergy(allergy){
        this.allergies.push(allergy)
        return allergy
    }
}

ben = new Person('Ben')     //  Creating a new Object
ben.addAllergy('Dairy')     //  Giving the object a new allergy
console.log(ben.allergies)  //  Should output ['Dairy']
ben.allergies = 'Soy'       //  Should make no changes to ben object.
ben.addAllergy('Peanutes')
console.log(ben.allergies)  // still array

writable по умолчанию false, поэтому вам не нужно явно устанавливать его, но я думаю, что это проясняет намерение. configurable также по умолчанию false, что означает, что вы не можете переопределить свойство с другим вызовом Object.defineProperty().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...