你能创建一个JSON构造函数吗?

时间:2014-01-02 02:21:05

标签: javascript json object constructor

我知道JSON用于交换信息。令我感到困惑的是,我希望能够使用JSON来存储和调用对象及其构造函数(如果可能),但由于JSON是字面符号,我想知道是否有办法用某种类型的方式填充JSON对象参数构造函数与普通构造函数的工作方式非常相似。

我发现最接近的是:

普通构造函数:

var dude = function(name, age) {
this.name = name;
this.age = age;
}
var bro = new dude("chad", 22);

JSON:

var bro = {
'name': "chad", 
'age': 22
};

但是考虑到构造函数你可以随时调用var bro2 = new dude("tony", 21);并且随时都有dude的新实例,即使这些也不一样。你怎么能把这种类型的功能与JSON混合在一起?

2 个答案:

答案 0 :(得分:2)

你对JSON究竟是什么有很大的误解。

var bro = {
  'name': "chad", 
  'age': 22
};

是具有object literal的javascript赋值运算符。它不是JSON,但bro对象的JSON表示看起来非常相似:

{ "name":"chad","age":22}

直到标签和空格。

因此,javascript中JSON对象的真实实例化将是

var bro = JSON.parse('{ "name":"chad","age":22}')

为了更好地了解读取this MDN article以及简单继承上的旧John Resig's article的内容。最有可能它会回答你的问题

答案 1 :(得分:0)

JSON是JavaScript的一个非常有限的子集,只能包含数据,而不能包含可执行代码。如果要为某些类型的每个对象执行代码,则必须自己管理。

一种解决方案是为每个JSON对象提供type属性:

// JSON data:
[{"type":"Book", "title"="Of Mice And Men", "author": { "type":"Dude", "name"="John Steinbeck" }}, ...]

并为每种类型定义“构造函数”函数:

var constructorsMap = {};
constructorsMap[ "Book" ] = function(o){ /* Book constructor code */ }
constructorsMap[ "Dude" ] = function(o){ /* Dude constructor code */ }

然后在解析之后扫描每个对象,在事实之后应用“构造函数”函数:

var books = JSON.parse( data );// the book data above
applyConstructor( books );

applyConstructor的定义类似于:

function applyConstructor(o)
{
   for( var p in o )
   {
     if( typeof o[p] == "object" )
     {
        applyConstructor(o[p]);
     }
     if( o.hasOwnProperty("type") )
     {
        if( typeof constructorsMap[o.type] == "function" )
        {
           constructorsMap[ o.type ].call( o, constructorsMap[o.type] );
        }
     }
   }
}