我有一个从JSON创建的JavaScript对象。我真的需要将其prototype属性设置为不同的对象,因为JS5 getter和setter。以下是我需要在Chrome上运行的示例:
function MyObj() { }
MyObj.prototype = {
get myProp : function () { return this._myProp; },
set myProp : function (arg) { this._myProp = arg; }
}
... stuff ...
var instance = JSON.parse(result);
instance.constructor = MyObj;
instance.__proto__ = MyObj.prototype;
使用此代码,我可以使用原型中定义的getter和setter在instance
上获取和设置属性。但是,这不是可移植的,不适用于IE,(我认为也不是节点)。
这样做的正确和便携方式是什么?
答案 0 :(得分:2)
反思:
创建MyObj
的新实例,然后将instance
的属性复制到其中。或者为MyObj
提供一个构造函数,当你为它提供一个参数时:
function MyObj(instance) {
if (instance) {
//copy properties
这样你甚至可以做到
var instance = new MyObj(JSON.parse(result));
答案 1 :(得分:1)
您可以尝试使用JSON reviver功能。
function revive(json) {
var m = new MyObj(), y;
return JSON.parse(json, function(k, v){
if (!y) y = this;
return k == "" ? m : this == y ? m[k] = v : v
});
}
调用revive('... a json string ...')
,它将使用JSON字符串中定义的属性吐出MyObj
的实例。
警告:这只有在JSON对象中的第一项是原始值时才有效。如果你的情况不可能,那么这是一个相当丑陋的解决方法:
function revive(json) {
var m = new MyObj(), c = json.charAt(0), y, a;
if (c == '[') {
a = json = '[0,' + json.substring(1);
} else if (c == '{') {
json = '{"@":0,' + json.substring(1);
}
return JSON.parse(json, function(k, v){
if (!y) { y = this; return; }
return k == "" ? m : this == y ? m[a ? k - 1 : k] = v : v
});
}