如何获得"类"的实例来自JSON字符串?

时间:2014-08-20 20:40:50

标签: javascript

鉴于我有一个类定义,如

(function () {
    function Dummy(){

        var toReturn ={
          myProp : "asdf",
          myFunc : myFunc
         }

         return toReturn;

        function myFunc(){};
    }    
})();

如何在

之后获得相同类型的实例
var dummy = new Dummy();

JSON.stringify(dummy);

这样我的myFunc仍然可用于该类型。

JSON.parse(JSON.stringify(dummy))以相同的类型返回相同形状的对象。

注意:我不是在询问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]);
                                }

                            }
                        }
                    }
                });
        }

1 个答案:

答案 0 :(得分:0)

注意,不确定要求,如果这与提出的问题类似。如果偏离主题,请发表评论,将退出。

Piece最初是为这个问题Organizing large javascript files [on hold]撰写的。通过json响应,有" x" type内容,可以将返回的对象映射到新对象,使用$.extend()复制属性。

结果将是具有返回数据的属性和功能的新object。在下面的部分,在完成流程后,$.Pagesfunction开头,然后类型转换为object - 尽管它可以同时保留functionobject属性在定义阶段加入|| {}

返回的json个对象中的函数可以在.then()回调中调用;请参阅jsfiddle的控制台,对象init函数。

最后,$.Pages对象具有返回json的属性,包括对函数的访问。基于jsonp类型的处理流程。

Piece is" frame"处理方法;可以扩展到包括其他功能

$(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)
});

jsfiddle http://jsfiddle.net/guest271314/60kv2439/1/(参见console

基本方法

$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)
  })

})