function User(obj) { for (var key in obj) { this[key] = ojb[key]; } } User.prototype.save = function(fn){ var user = this; ... client.hmset('user:1', user, function(err) { ... }); }
然后测试该模型:
var tobi = new User({ name: 'Tobi', pass: 'secret-passwd', age: '2' }); tobi.save(function(err){ if (err) throw err; };
运行测试代码,没有抛出错误。
然后用 redis-cli 连接上redis服务器,
$ redis-cli redis> hgetall user:1 ... 5) "pass" 6) "$2a$12$6TzJmjaenQfmYPb7DFHtUeJg.gzbfoOznW5uU4CUhj1aylNky4Z1C" 7) "age" 8) "2" ... 13) "save" 14) "function (fn){\r\n ...
请看上面输出的 13), 14) 部分,为什么定义在 User.prototype 上的 save 方法也被保存在该 User 实例上了呢?
请问原型上定义的方法不是定义到 User.prototype 对象上了吗?我的理解是该原型对象独立于 User 实例,所以redis保存的User 实例不应该有 save 方法。这是从<Node.js In Action> 一书上摘抄的例子,书上的同样的代码输出是没有 save 方法的。
原型上定义的方法为可以枚举,可以使用es6类的写法,在类中定义的方法不可枚举,经测试可以实现你要的功能
已经找到问题原因了,书上用的 redis 库是 0.7.2 版本的,我上边的例子用的是最新版本的,所以导致不一致,0.7.2版本的 redis 库不会保存原型方法。