Nodejs中Redis保存Javascript类实例是否会连同原型上定义的方法一并保存?
Nodejs中Redis保存Javascript类实例是否会连同原型上定义的方法一并保存?
先定义一个“类”:
function User(obj) {
for (var key in obj) {
this[key] = ojb[key];
}
}
再在原型上定义一个方法,该方法会将实例自身保存到 redis 里:
User.prototype.save = function(){
redis_client.hmset('user111', this);
};
测试:
var tobi = new User({
name: 'Tobi',
pass: 'secret-passwd',
age: '2'
});
tobi.save();
然后去到 redis-cli 里输出该对象,会发现连同原型上的 save 函数也保存了:
$ redis-cli
redis> hgetall user111
…
5) “pass”
6) “secret-passwd”
7) “age”
8) “2”
…
13) “save”
14) "function (){\r\n
…
请注意上面输出的 13), 14)
部分,正是在原型上定义的方法。
这其实是《 Nodejs 实战》书里的一个例子,书里的输出是没有原型上的方法的,只保存了实例属性。我这里的输出为什么有原型方法呢?
可能是你用的 redis 库有更新。不过 redis 里存的都是字符串,所以一般也没人这么用。
关键看这个库的序列化方法吧,和 redis 没关系。
感谢!经你的提醒,我刚刚安装了和书上一样版本(旧)的 redis 库,测试下来果然没有保存 save 方法,确实是因为库更新造成的。
在Node.js中使用Redis保存JavaScript类实例时,通常不会直接保存类的实例及其原型上定义的方法。Redis是一个键值存储系统,主要设计用于存储字符串、哈希、列表、集合等数据结构,而不是直接存储JavaScript对象。
当你尝试将JavaScript对象(包括类的实例)保存到Redis时,通常会先将对象序列化为JSON字符串(或其他格式),然后再存储。由于JSON序列化只包含对象的可枚举属性,不包括函数或原型链上的方法,因此原型上的方法不会被保存。
以下是一个简单的示例,展示了如何将类的实例序列化为JSON并保存到Redis中:
const redis = require('redis');
const client = redis.createClient();
class MyClass {
constructor(name) {
this.name = name;
}
greet() {
return `Hello, ${this.name}!`;
}
}
const instance = new MyClass('Alice');
const jsonString = JSON.stringify(instance); // 只包含name属性
client.set('myKey', jsonString, redis.print);
client.get('myKey', (err, reply) => {
if (err) throw err;
const parsedObject = JSON.parse(reply);
console.log(parsedObject); // { name: 'Alice' },没有greet方法
});
client.quit();
在这个例子中,greet
方法不会被保存到Redis中,因为JSON序列化过程中忽略了它。如果你需要保存和恢复函数,你可能需要实现自定义的序列化和反序列化逻辑。