web-dev-qa-db-ja.com

classMethodsとinstanceMethodsの比較

それでNodeのすべてのものへの冒険を始めました。私が学ぼうとしているツールの1つは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;
};
_

classMethodsinstanceMethodsを使用するタイミングについて混乱しています。 createSalt()hashPassword()について考えるとき、クラスメソッドである必要があります。それらは一般的なものであり、ほとんどの場合、単に一般的に使用されている特定のインスタンスとは関係ありません。しかし、classMethodscreateSalt()hashPassword()がある場合、instanceMethodsから呼び出すことはできません。

次のバリエーションを試しました。

_this.createSalt();
this.classMethods.createSalt();
createSalt();
_

以下のようなものはうまくいかず、おそらく単純なものを理解していないだけです。

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

ヒント/ヒント/方向は非常に高く評価されます!

17
Silent

インスタンスのタイプを変更またはチェックしないメソッドはすべてclassMethodで、残りはinstanceMethodでなければなりません

例:

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

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

基本的には、instance(ergo row)を変更する場合は、instanceメソッドを使用する必要があります。 classMethods(ergo the table)自体を使用しないメソッドでclassを汚染したくない。

あなたの例では、クラスの外にhashPassword関数を配置し、ユーティリティモジュールのどこかにヘルパー関数として残します(または、同じモジュールではなく通常の定義関数として)...のように

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

...

...

  instanceMethods: { 
     authenticate: function( ... ) { hashPassword( ... ) }
  }
1
drinchev

私はこれがsequelize 3.14の時点で私のために働いたことを発見しました

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

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