node.js - Redis 保存 Javascript object,为什么连同 prototype 上定义的方法也一并保存了?

查看:76
本文介绍了node.js - Redis 保存 Javascript object,为什么连同 prototype 上定义的方法也一并保存了?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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 方法的。

解决方案

已经找到问题原因了,书上用的 redis 库是 0.7.2 版本的,我上边的例子用的是最新版本的,所以导致不一致,0.7.2版本的 redis 库不会保存原型方法。

这篇关于node.js - Redis 保存 Javascript object,为什么连同 prototype 上定义的方法也一并保存了?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆