Javascript 如何从JSON字符串中获取“类”的实例?
假设我定义了一个类,比如Javascript 如何从JSON字符串中获取“类”的实例?,javascript,Javascript,假设我定义了一个类,比如 (function () { function Dummy(){ var toReturn ={ myProp : "asdf", myFunc : myFunc } return toReturn; function myFunc(){}; } })(); 之后如何获得相同类型的实例 var dummy = new Dummy()
(function () {
function Dummy(){
var toReturn ={
myProp : "asdf",
myFunc : myFunc
}
return toReturn;
function myFunc(){};
}
})();
之后如何获得相同类型的实例
var dummy = new Dummy();
JSON.stringify(dummy);
这样我就可以在类型上使用myFunc了
JSON.parseJSON.stringifydummy以不同类型返回相同形状的对象
注意:我不是问JSON的功能,而是问人们一般如何处理这个问题。您是否手动滚动映射机制,以便在从JSON解析后将其映射到类型的实例上,或者在某些库中是否有这样的功能,例如下划线
我创建了一个帮助函数来帮助我做到这一点,但我想听听其他人如何处理这种情况。正如我在注释中所说的,JSON已经过了线,我们已经为它定义了一个类型。为了从类型中的JSON获取值,我们解析JSON,创建类型的实例,然后应用下面的map函数
function map(fromObj, toObj) {
Object.keys(fromObj)
.forEach(function (key) {
if (typeof fromObj[key] != 'function') {
if (toObj.hasOwnProperty(key)) {
if (typeof fromObj[key] !== 'object') {
toObj[key] = fromObj[key];
} else {
map(fromObj[key], toObj[key]);
}
}
}
}
});
}
请注意,若这与问题中提出的类似,则不确定要求。如果偏离主题,请发表评论,将撤回 这篇文章最初是为这个问题撰写的。使用json响应,具有x类型的内容,可以将返回的对象映射到新对象,并使用$.extend复制属性 结果将是具有返回数据的属性和函数的新对象。在下面的一段中,在流程完成时,$.Pages开始作为函数,然后类型转换为对象-尽管它可以通过在定义阶段包含| |{}来保留函数和对象属性 返回的json对象中的函数可以在中调用。然后回调;请参阅JSFIDLE上的控制台,对象初始化函数 最后,$.Pages对象具有返回的json的属性,包括对函数的访问。基于jsonp类型的处理流 工件是一种加工方法的框架;可以扩展到包括其他功能
$(function() {
var dfd = new $.Deferred();
dfd.progress(function(msg) {
console.log(msg);
});
ProductPage = {
name : "ProductPage",
addToCartBtn: "#add-to-cart",
initName : function() {return dfd.notify(this.name)},
init: function() {
this.initName();
// ProductPage.initAddToCartPopup();
// ProductPage.initSidebar();
}
};
ContactPage = {
name : "ContactPage",
validateEmail : function (e) {return dfd.notify(e)},
initName : function() {return dfd.notify(this.name)},
init: function() {
this.initName();
// ProductPage.initAddToCartPopup();
// ProductPage.initSidebar();
}
};
var mods = function() {
return {"ContactPage" : ContactPage
, "ProductPage" : ProductPage };
};
$.Pages = function() {
$.when(mods())
.done(function(pages) {
$.Pages = pages;
});
return $.Pages
};
$.when($.Pages())
.then(function() {
$.each($.Pages, function(k, v) {
v.init();
})
});
console.log($.Pages)
});
JSFIDLE see控制台
基本方法
$p = {};
var queue = [];
var mods = ["dep1.json", "service1.json"];
var mod = function(m) {
queue.push(m);
if (queue.length === mods.length) {
$.each(queue, function(k, v) {
$p = $.extend(v, $p)
})
}
};
$.each(mods, function(k, v) {
$.getScript(v, function(script, status, jqxhr) {
console.log($p)
})
})
JSON不能表示JavaScript函数,因此myFunc属性的序列化方式不能使其在解析时再次成为函数。@cdhowie我断言JSON可以将JavaScript函数表示为表示源的字符串,但要注意范围,但是这样的转换不是标准的,也不受JSON.*方法的支持。@cdhowie:我知道,我的问题不是如何使用JSON进行转换,而是一般如何进行转换。@epitka一般来说,不要将其转换为文本。要编写这样的自定义文本编码,可以考虑函数.ToStand,这样生成一个有意义的结果和某种形式的EVAL。这将丢失词法范围,例如原始函数创建的闭包。对于其他对象类型,例如Dummy,定义一个适用的编码,例如ie。还存储构造函数的名称,并定义如何重构它们的规则。这两种转换都会很快崩溃,但可以应用于特定情况。@除非目标是生成一个通用对象序列化程序(我确信有一些尝试),否则我将使用一组转换规则,如中所示。基本上,它使用默认规则遍历JSON对象图以恢复适用的对象结构,但也允许将函数和转换应用于映射过程。看看create规则,它允许为匹配的源节点返回任意数据(例如自定义对象)。