Как работают секвестрирующие геттеры и сеттеры?

Резюме вопроса: Концептуально, что такое getters и seters и почему мы будем использовать их?

Выдержка из http://docs.sequelizejs.com/en/latest/docs/models-definition/?highlight=getterMethods#getters-setters:

В ваших моделях можно определить функции-объекты-объекты-объекты и свойства-объекта-объекта, которые могут использоваться как для "защиты" свойств, которые сопоставляются с полями базы данных, так и для определения свойств "псевдо".

  • Что значит "защищать"? Против чего?

  • Что такое свойства psuedo?

Я также борюсь с приведенным ниже примером кода. Кажется, мы дважды устанавливаем "заголовок". И что такое аргумент 'v'?

См. ниже:

var Foo = sequelize.define('Foo', {
  title: {
    type     : Sequelize.STRING,
    allowNull: false,
  }
}, {

  getterMethods   : {
    title       : function()  { /* do your magic here and return something! */ },
    title_slug  : function()  { return slugify(this.title); }
  },

  setterMethods   : {
    title       : function(v) { /* do your magic with the input here! */ },
  }
});

Приветствуется конкретный пример вместо "do magic".

Ответы

Ответ 1

псевдо свойства

Были бы свойства, которые с точки зрения пользователя выглядят как обычные свойства объекта, но не существуют в базе данных. Возьмем, например, пользовательский объект, который имеет имена и имена. Затем вы можете создать setname setter:

var foo = sequelize.define('foo', {
    ..
}, {
    getterMethods: {
        fullName: function () {
            return this.getDataValue('firstName') + ' ' + this.getDataValue('lastName')
        }
    },
    setterMethods: {
        fullName: function (value) {
            var parts = value.split(' ')

            this.setDataValue('lastName', parts[parts.length-1])
            this.setDataValue('firstName', parts[0]) // this of course does not work if the user has several first names
        }
    }
})

Когда у вас есть пользовательский объект, вы можете просто сделать

console.log(user.fullName) 

Чтобы просмотреть полное имя пользователя. Геттер затем вызывается за кулисами.

Аналогично, если вы определяете метод setter для полного имени, вы можете сделать

user.fullName = 'John Doe'

который затем разделил бы переданную строку на две части и сохранил их в имени и фамилии. (см. упрощенный пример выше)

Защитить свойства

@ahiipsa уже послужил хорошим примером этого. Getters вызывается, когда вы выполняете user.toJSON(), поэтому вы можете использовать геттеры для простого удаления конфиденциальных данных перед отправкой пользователю.