node.js - Redis 保存 Javascript object,为什么连同 prototype 上定义的方法也一并保存了?
PHP中文网
PHP中文网 2017-04-10 17:55:58
[JavaScript讨论组]
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 方法。这是从 一书上摘抄的例子,书上的同样的代码输出是没有 save 方法的。

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
大家讲道理

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

阿神

原型上定义的方法为可以枚举,可以使用es6类的写法,在类中定义的方法不可枚举,经测试可以实现你要的功能

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号