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

Javascript 你能创建一个JSON构造函数吗?,javascript,json,object,constructor,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: 但是考虑到你可

我知道JSON是用来交换信息的。让我困惑的是,如果可能的话,我希望能够使用JSON来存储和调用对象及其构造函数,但由于JSON是文字符号,我想知道是否有一种方法可以像普通构造函数那样使用某种类型的构造函数来填充JSON对象参数

我发现的最接近的东西是:

普通构造函数:

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


但是考虑到你可以调用的构造函数
var bro2=newdude(“tony”,21),即使这些函数也不完全相同
在任何时候,只要您愿意,就可以创建一个新的
dude
实例。你怎么能在混合使用JSON的情况下保持这种功能呢?

你对JSON到底是什么有很大的误解

这个

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

{ "name":"chad","age":22}
最多到选项卡和空格

因此,javascript中JSON之外的对象的实际实例化将是

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

为了更好地理解正在发生的事情,请阅读这篇关于简单继承的老文章。它很可能会回答您的问题

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

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

// 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] );
        }
     }
   }
}

JSON是一种主要用于字符串的格式,因此您的问题不像您想象的那么容易理解,您真的只讨论常规javascript对象吗?是的,但您也可以将复杂对象存储在JSON中。您在第二个代码示例中调用的JSON不是JSON。它是使用JavaScript的文本语法创建对象。JSON是一种可移植的、平台无关的数据序列化方案,它使用JavaScript文本语法的子集。我不确定您的JSON示例是否真的是JSON。JSON表示的是javascript对象表示法,是一个可以轻松序列化为javascript对象的字符串。请停止阅读。他们因糟糕的建议、用词不当等而臭名昭著。此外,他们与W3C并没有任何联系,并且拒绝明确说明这一点。
var books = JSON.parse( data );// the book data above
applyConstructor( books );
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] );
        }
     }
   }
}