续集classMethods vs instanceMethods

所以开始我所有的事情冒险的节点。 我想学习的工具之一是Sequelize。 所以我会开始我想做的事情:

'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中创build了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; } 

任何提示/技巧/方向将非常赞赏!

       

网上收集的解决方案 "续集classMethods vs instanceMethods"

所有不修改或检查任何types实例的方法都应该是classMethod和其余的instanceMethod

例如:

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

虽然基本知识是,当你想修改你的instance (ergo行)时,应该使用instance方法。 我宁愿不污染classMethods方法,不使用class (ergo表)本身。

在你的例子中,我会把hashPassword函数放在你的类之外,并把它作为一个辅助函数放在我的工具模块的某个地方(或者为什么不是相同的模块,而是一个正常定义的函数)…就像

 var hashPassword = function(...) { ... } ... ... instanceMethods: { authenticate: function( ... ) { hashPassword( ... ) } } 

我发现这对我3.14作业

 var myModel = sequelize.define('model', { }, { classMethods: { someClassMethod: function() { return true; } }, { instanceMethods: { callClassMethod: function() { myModel.someClassMethod(); } } });