Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从JSON字符串中获取“类”的实例?_Javascript - Fatal编程技术网

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规则,它允许为匹配的源节点返回任意数据(例如自定义对象)。