2012-06-01 2 views
1

Итак, у меня есть объект javascript, к которому я подключил несколько методов через прототип.Как деперсировать объект JSON обратно в объект со связанными методами?

Не беспокойтесь.

Теперь, когда я сохраняю этот объект в JSON, сохраняются только фактические значения свойств. Это имеет смысл. Как бы вы упорствовали в методах, так или иначе?

Но, когда я отменяю объект JSON, я, конечно же, заканчиваю тем, что выглядит, как свойство, как мой первоначальный объект, который уже не имеет никаких связанных с ним методов.

я понимаю + почему + это бывает.

Мой вопрос: есть ли какой-нибудь шаблон для обработки этой ситуации?

С моей стороны, я открыл небольшую библиотеку js под названием Classy classes for JS, что позволяет вам делать что-то вроде этого.

var MyClass = Class.$extend({ 
    __init__ : function() { alert('called'); }, 
    toString() : function() { 
    return this.value; 
    }) 
}); 
var obj = MyClass.$withData({value: 42}); 
alert(obj.toString()); 

Это + делает + работу, но я не могу видеть, как легко применить его к глубокой иерархии объектов.

EDIT: Первоначально я был не очень ясен. Я знаю, что Classy (и собственно jquery, как мне только что известно) может применять данные к конкретному объекту для смешивания прототипированных методов, но реальный вопрос заключается в том, как сделать это для более глубокой иерархии объектов.

ответ

0

Если у вас есть, например, jQuery вы можете использовать $.extend(obj, yourDataFromJSON);

Это объединит все данные из второго объекта в первый, заменив существующие значения.

Однако, согласно Classy code вы можете просто использовать MyClass.$withData(yourDataFromJSON); даже для вложенных данных:

for(var key in data) { 
    var value = getOwnProperty(data, key); 
    if(value !== undefined) rv[key] = value; 
} 

Как вы можете видеть, все из data помещается в объект - независимо от того, если это другой объект (если у вас есть вложенные данные), массив или что-то еще, что не undefined (которого даже не существует в JSON)

+0

Я экспериментировал с этим, но не похоже, что какие-либо прототипные методы добавляются в эти подобъекты, и, честно говоря, я не вижу, как они могут быть, без какого-либо кода где-то исполняющего на "$ .extend (obj, yourDataFromJSON);" на каждом объекте, поскольку иерархия находится в обратном порядке. Думаю, все в порядке. Я знаю, что js не похож на ваши традиционные классы, ориентированные на языки. Мне просто интересно, существует ли уже общая картина для решения чего-то подобного. – DarinH

+0

withData: * Создает новый экземпляр класса путем обхода конструктора и назначения атрибутов из данного объекта. Это полезно, если вы хотите присоединить методы к объекту, полученному от объекта JSON * - поэтому у объекта * есть * методы вашего класса. – ThiefMaster

+0

Да, Withdata, вероятно, лучший способ пойти. Я столкнулся с некоторыми проблемами с Classy, ​​JQMobile и Knockout, хотя JQ-расширение, похоже, работает последовательно со всеми этими библиотеками. – DarinH

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