我知道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混合在一起?
答案 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] );
}
}
}
}