sequelize.js中classMethods与instanceMethods的用法区别及理解确认
你的理解完全正确,这两个配置项的定位和你描述的完全一致,也符合官方的预期使用场景。
概念确认
- classMethods 是挂载到模型构造函数上的静态方法,属于整个模型的通用能力,不需要依赖某条具体的数据库记录就能调用。你示例中的
hashify_password就是典型的类方法使用场景:密码哈希逻辑和具体用户无关,调用时直接用User.hashify_password(你的密码)即可,不需要先查询出用户实例。 - instanceMethods 是挂载到模型原型上的实例方法,每个查询返回的单条记录实例都可以调用,方法内部的
this默认指向当前这条记录的实例对象。你示例中的is_my_password就是典型的实例方法使用场景:校验密码需要对比当前用户存储在数据库里的加密密码,调用时需要先拿到指定用户的实例,再执行user.is_my_password(输入的密码),内部的this.password就对应当前实例的密码字段值。
补充说明
这两个配置项是Sequelize v3、v4版本的旧API,v4版本之后就已经废弃,所以你在最新的官方文档里找不到相关说明。新版本的替代写法有两种:
- ES6类继承定义模型时直接写方法:
class User extends Model { // 类方法等价于原来的classMethods static hashify_password(password) { // 逻辑和之前一致 } // 实例方法等价于原来的instanceMethods is_my_password(password) { return User.hashify_password(password) === this.password } } User.init({ /* 字段定义 */ }, { sequelize })
- 手动挂载方法:
// 类方法 User.hashify_password = function(password) { /* 逻辑 */ } // 实例方法 User.prototype.is_my_password = function(password) { /* 逻辑 */ }
你贴的代码示例的用法完全符合这两个API的设计意图,使用逻辑是正确的。
内容的提问来源于stack exchange,提问作者Alexander Solonik
相关产品推荐
相关产品推荐

