2014-08-20 2 views
0

Учитывая, что у меня есть класс, определенный как, напримерКак получить экземпляр класса из строки JSON?

(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, создаем экземпляр типа и затем применяем функцию карты ниже.

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

          } 
         } 
        } 
       }); 
     } 
+3

JSON не могут представлять функции JavaScript, поэтому 'myFunc' свойство не может быть сериализованы таким образом, что приведет к тому, что он снова станет функцией при анализе. – cdhowie

+0

@cdhowie Я бы сказал, что JSON * может * представлять функции JavaScript (как строки, представляющие источник, с оговорками об области), но что такое преобразование не является стандартным или не поддерживается методами JSON. *. – user2864740

+0

@cdhowie: Я знаю, что мой вопрос был не в том, как это сделать с JSON, но как это сделать в целом. – epitka

ответ

0

Примечание. Не определено о требованиях, если это похоже на то, что поставлено на вопрос. Если не по теме, пожалуйста, напишите комментарий, выйдет.

Piece был первоначально составлен для этого вопроса Organizing large javascript files [on hold]. С ответом json, содержащим «x» type, можно было отобразить возвращаемый объект на новый объект, скопировав свойства, используя $.extend().

Результат будет новым object, обладающим как свойствами, так и функциями возвращенных данных. На рисунке ниже, по завершении процесса, $.Pages начинается с function, затем тип преобразуется в object - хотя он может сохранить как function, так и object объектов недвижимости, включив || {} на этапе определения.

Функции в пределах возвращенных json объектов можно было бы вызвать в пределах .then() callback; см. консоль в jsfiddle, объект init функции.

В заключение, $.Pages объект имеет свойства недвижимости json, включая доступ к функциям. На основе потока обработки типа jsonp.

Piece является «рамкой» подхода к обработке; может охватывать и другие функциональные возможности

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

}) 
Смежные вопросы