问题摘要: 从概念上讲,什么是 getter 和 setter,我们为什么要使用它们?

摘自 http://docs.sequelizejs.com/en/latest/docs/models-definition/?highlight=getterMethods#getters-setters :


  • “保护”是什么意思?反对什么?
  • 什么是“伪”属性?

  • 我也在为下面的示例代码苦苦挣扎。我们似乎两次设置“标题”。什么是参数“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! */ },
      }
    });
    

    一个具体的例子而不是“做魔术”将不胜感激!

    最佳答案



    将是属性,从用户的角度来看似乎是对象的常规属性,但不存在于数据库中。以具有名字和姓氏字段的用户对象为例。然后你可以创建一个全名 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)
    

    查看用户的全名。然后在幕后调用 getter。

    同样,如果你为全名定义一个 setter 方法,你可以这样做
    user.fullName = 'John Doe'
    

    然后将传递的字符串分成两部分并将它们保存在名字和姓氏中。 (参见上面的简化示例)



    @ahiipsa 已经提供了一个很好的例子。当您执行 user.toJSON() 时会调用 getter,因此您可以使用 getter 在将敏感数据发送给用户之前轻松删除敏感数据。

    关于node.js - sequelize getter 和 setter 是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21949554/

    10-13 08:55