我知道所有关于JSON.stringify或JSON.parse的意思是,一个序列化一个对象,一个将字符串反序列化回一个对象。这很棒!
但是,我有以下情况:
var i = new MyMagicalObject();
var oi = JSON.parse(JSON.stringify(i));
console.log(i.numFields()); // this is fine
console.log(oi.numFields()); // this throws since Object has no method 'numFields'
基本上,我希望将oi视为" MyMagicalObject"因为它是什么。
我确信在oi或其他东西上设置原型有一些神奇之处,但我对JavaScript来说还是个新手。任何帮助将不胜感激。
答案 0 :(得分:2)
你不能存储" JSON字符串中的JavaScript函数。
可以存储在JSON中的唯一数据类型是:
- 数
- 字符串
- 布尔
- 阵列
- 对象
- 空
任何不属于这些类型的东西都会被忽略:
function Test(){
this.foo = function(){
return 'bar';
}
this.theAnswer = '42';
}
var t = new Test();
alert(t.foo());
alert(JSON.stringify(t))

答案 1 :(得分:1)
您可以创建一个新的MyMagicalObject()
,然后使用oi中的属性覆盖其属性。
var t = new MyMagicalObject();
for(var k in oi) t[k]=oi[k];
这应该可以解决问题。如果您有一个更复杂的对象(具有多个维度),请搜索深度复制所有属性的复制函数。
答案 2 :(得分:1)
重新设计MyMagicalObject
课程可以轻松解决您的问题。以下是JSON友好类的示例:
function MyMagicalObject(props) {
this.props = props || {};
}
MyMagicalObject.prototype.get = function(key) {
return this.props[key];
};
MyMagicalObject.prototype.set = function(key, val) {
this.props[key] = val;
return this;
};
MyMagicalObject.prototype.toJSON = function() {
return this.props;
};
MyMagicalObject.prototype.numFields = function() {
return Object.keys(this.props).length;
};
这种认识遵循两条规则:
toJSON
方法来告诉JS引擎如何将其实例转换为JSON。检查以下示例:
var obj = new MyMagicalObject();
obj.set('foo', 42).set('bar', 'baz');
alert(obj.numFields()); // 2
var str = JSON.stringify(obj);
var obj2 = new MyMagicalObject(JSON.parse(str));
alert(obj2.numFields()); // 2
答案 3 :(得分:0)
在第3行之后添加oi.prototype = MyMagicalObject.prototype;
。
或
创建一个新对象并复制属性:
var oi2 = new MyMagicalObject();
for (var p in oi) {
if (oi.hasOwnProperty(p)) {
oi2[p] = oi[p]
}
}
console.log(oi2.numFields());