2015-12-14 26 views
15

所以開始我所有的事情冒險節點。我想學習的工具之一是Sequelize。因此,我將開始我試圖做的事:續集類方法vs instanceMethods

'use strict'; 
 
var crypto = require('crypto'); 
 

 
module.exports = function(sequelize, DataTypes) { 
 
    var User = sequelize.define('User', { 
 
    username: DataTypes.STRING, 
 
    first_name: DataTypes.STRING, 
 
    last_name: DataTypes.STRING, 
 
    salt: DataTypes.STRING, 
 
    hashed_pwd: DataTypes.STRING 
 
    }, { 
 
    classMethods: { 
 

 
    }, 
 
    instanceMethods: { 
 
     createSalt: function() { 
 
     return crypto.randomBytes(128).toString('base64'); 
 
     }, 
 
     hashPassword: function(salt, pwd) { 
 
     var hmac = crypto.createHmac('sha1', salt); 
 

 
     return hmac.update(pwd).digest('hex'); 
 
     }, 
 
     authenticate: function(passwordToMatch) { 
 
     return this.hashPassword(this.salt, passwordToMatch) === this.hashed_pwd; 
 
     } 
 
    } 
 
    }); 
 
    return User; 
 
};

我在什麼時候使用classMethods VS instanceMethods困惑。對我來說,當我想到createSalt()和hashPassword()應該是類方法。它們是普遍的,而且大多數情況下,它們實際上與他們通常使用的特定實例沒有任何關係。但是當我在classMethods中創建了createSalt()和hashPassword()時,我無法從instanceMethods調用它們。

我曾嘗試以下的變化:

this.createSalt(); 
this.classMethods.createSalt(); 
createSalt(); 

類似下面不會工作,我可能只是不理解簡單的東西。

authenticate: function(passwordToMatch) { 
    console.log(this.createSalt()); 
    return this.hashPassword(this.salt, passwordToMatch) === this.hashed_pwd; 
} 

任何提示/技巧/方向將非常讚賞!

回答

21

所有誰不修改或檢查任何類型的實例應該是類方法,其餘的方法instanceMethod

例如:

//should be a classMethods 
 
function getMyFriends() { 
 
    return this.find({where{...}}) 
 
} 
 

 
//should be a instanceMethods 
 
function checkMyName() { 
 
    return this.name === "george"; 
 
}

+0

這是有道理的我,這就是我那種想通所以一般功能,如makeSalt()和hashPassword()應該是類的方法,因爲他們真的有與具體實例無關。所以說,現在我真正的問題,我想是不能夠在我的instanceMethod裏面調用一個classMethond,並且不知道這個交易是什麼。 – Silent

+0

我加入了IRC,他們能夠幫助我。它有點不同,然後我也在其他語言中使用,但這只是學習過程的一部分!因爲它是一個類方法,它只是模型的一部分,所以你不必使用「this」之類的東西。你只是稱它爲「User.getSalt()」,所以它現在所有的工作正如我所預料的那樣! – Silent

+0

我感謝您的幫助! – Silent

1

雖然基本是instance方法應該用於當你想修改你的instance(ergo行)。我寧願不污染classMethods與方法,不使用class(ergo表)本身。

在你的榜樣,我會把hashPassword功能類的外部,並把它作爲一個輔助函數的地方在我的事業模塊(或者爲什麼不一樣的模塊,但作爲一個正常的定義函數)......像

var hashPassword = function(...) { ... } 

... 

... 

    instanceMethods: { 
    authenticate: function(...) { hashPassword(...) } 
    } 
+0

我想知道如何做到這一點。我想我會繼續努力,只是爲了養成這樣做的習慣。我無法決定是否將它分開,因爲我只在用戶模型中使用hashPassword。 – Silent

1

我發現這個工作對我來說是sequelize 3.14

var myModel = sequelize.define('model', { 

}, { 
    classMethods: { 
    someClassMethod: function() { 
     return true; 
    } 
}, { 
    instanceMethods: { 
    callClassMethod: function() { 
     myModel.someClassMethod(); 
    } 
    } 
});