2014-02-22 27 views
15

問題摘要:從概念上講,什麼是getter和setters以及我們爲什麼要使用它們?如何使getter和setter工作?

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

摘錄:

它可以定義您的模型「對象屬性」 getter和setter函數,這些可以爲「保護」映射到數據庫字段屬性和定義使用這兩種'僞'屬性。

  1. 這是什麼意思 '保護'?反對什麼?

  2. 什麼是'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! */ }, 
    } 
}); 

一個具體的例子,而不是 「做魔力」 將不勝感激!

回答

20

僞性能

將是,從用戶的角度來看似乎是對象的常規屬性的屬性,但在數據庫中不存在。以例如具有名字和姓氏字段的用戶對象爲例。然後,您可以創建一個全稱二傳手:

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()時會調用Getters,因此您可以使用getters輕鬆刪除敏感數據,然後將其發送給用戶。

+1

1月,當我添加一個僞屬性findAll options.attributes它失敗,並說我的僞屬性不存在於數據庫中。這對我來說很有意義,但我會假設Sequelize會知道這一點併爲我處理。這是預期的行爲還是有辦法選擇psuedo屬性?我想現在每個僞屬性都包含默認.... –