在 JavaScript 中将 JSON 字符串解析为特定对象原型

2022-08-30 01:24:02

我知道如何解析JSON字符串并将其转换为JavaScript对象。您可以在现代浏览器(和IE9 +)中使用。JSON.parse()

这很好,但是我怎么能把那个JavaScript对象变成一个特定的JavaScript对象(即具有某个原型)呢?

例如,假设您有:

function Foo()
{
   this.a = 3;
   this.b = 2;
   this.test = function() {return this.a*this.b;};
}
var fooObj = new Foo();
alert(fooObj.test() ); //Prints 6
var fooJSON = JSON.parse({"a":4, "b": 3});
//Something to convert fooJSON into a Foo Object
//....... (this is what I am missing)
alert(fooJSON.test() ); //Prints 12

同样,我并不想知道如何将JSON字符串转换为通用JavaScript对象。我想知道如何将JSON字符串转换为“Foo”对象。也就是说,我的对象现在应该有一个函数“test”和属性“a”和“b”。

更新在做了一些研究之后,我想到了这个...

Object.cast = function cast(rawObj, constructor)
{
    var obj = new constructor();
    for(var i in rawObj)
        obj[i] = rawObj[i];
    return obj;
}
var fooJSON = Object.cast({"a":4, "b": 3}, Foo);

这样行得通吗?

2017年5月更新:“现代”方法是通过Object.assign,但此功能在IE 11或更早的Android浏览器中不可用。


答案 1

当前的答案包含大量手卷或库代码。这不是必需的。

  1. 用于创建纯文本对象。JSON.parse('{"a":1}')

  2. 使用其中一个标准化函数来设置原型:

    • Object.assign(new Foo, { a: 1 })
    • Object.setPrototypeOf({ a: 1 }, Foo.prototype)

答案 2

请参阅下面的示例(此示例使用本机 JSON 对象)。我的更改在大写字母中注释:

function Foo(obj) // CONSTRUCTOR CAN BE OVERLOADED WITH AN OBJECT
{
    this.a = 3;
    this.b = 2;
    this.test = function() {return this.a*this.b;};

    // IF AN OBJECT WAS PASSED THEN INITIALISE PROPERTIES FROM THAT OBJECT
    for (var prop in obj) this[prop] = obj[prop];
}

var fooObj = new Foo();
alert(fooObj.test() ); //Prints 6

// INITIALISE A NEW FOO AND PASS THE PARSED JSON OBJECT TO IT
var fooJSON = new Foo(JSON.parse('{"a":4,"b":3}'));

alert(fooJSON.test() ); //Prints 12