2016-07-25 3 views
0

Я хотел бы создать коллекцию объектов, которая работает как массив. Некоторое время назад, я сделал this question и я придумал следующее решение с помощью людей, которые помогли мне:Javascript - коллекция объектов с родительскими свойствами в общем

Newobj.Collection = function(){ 
    Array.apply(this); 

    for(var i = 0; i < arguments.length; i++){ 
     for(var j = 0; j < arguments[i].length; j++){ 
      this.push(arguments[i][j]); 
     } 
    } 

    return this 
} 

Newobj.Collection.prototype = Object.create(Array.prototype); 
Newobj.Collection.prototype.push = function(o){ 
    Array.prototype.push.call(this, new Newobj.Element(o)); 
} 

Однако, это оставляет детей Unconnected от родителей. Например, представьте, что в этой коллекции есть функция render(), которая позволяет своим детям печатать HTML-код на странице. Ну, я хотел бы быть в состоянии сказать что-то вроде:

Newobj.Collection.html_container = '#cont'; 

Newobj.Collection.render = function(){ 
    $.each(this, function(i, el){ 
     el.render() 
    }) 
} 

Newobj.Element.render = function(){ 
    $(parent.html_container).html('.......') 
} 

Он должен быть в состоянии установить различные коллекции на одной странице, так что глобальный container для всех в Newobj.Collection s не является решением проблемы. Это пример, и мне это нужно для более сложных процессов, чем просто функция render().

У кого-нибудь есть идея, как я могу сделать массив доступным для родительского класса, частью которого он является?

Если решение может быть JSON.stringify ed и рассматриваться как массив на стороне сервера, было бы здорово, хотя это не основная проблема для этого вопроса. Прямо сейчас, если я задаю свойство массиву, он рассматривается как объект с size > 0 на стороне сервера.

Спасибо!

ответ

1

Создать ссылку на коллекцию в элементе:

Newobj.Collection.prototype.push = function(o){ 
    Array.prototype.push.call(this, new Newobj.Element(o,this)); 
} 

//element constructor gets as second paramater instance of collection 
Newobj.Element=function(o,collection){ 

    //this.parent in every element is collection reference 
    this.parent=collection; 
} 


Newobj.Element.prototype.render = function(){ 
    $(this.parent.html_container).html('.......') 
} 

или нет ссылки в опции Element:

Newobj.Collection.render = function(){ 

    var parent=this; 

    $.each(this, function(i, el){ 
    el.render(parent.html_container) 
    }) 
} 

Newobj.Element.render = function(html_container){ 
    $(html_container).html('.......') 
} 

Но эта версия должна иметь параметры методов.

+0

Не думал об этом. Я проверю его, и когда я увижу, работает ли он (что он должен, когда я его прочитаю), я помечаю ваш ответ как правильный! Спасибо за помощь! – Unapedra

+0

У меня возникла проблема * производительности *. Если я поместил * collection * в качестве параметра, что произойдет с элементом номер 100, когда я туда доберусь? Будет ли оно иметь свойство, называемое * parent *, в котором уже есть 99 других элементов? и 99-й, будет иметь свойство * parent * с массивом с 98 элементами и так далее? – Unapedra

+0

Этот параметр является ссылкой на объект, поэтому он будет содержать не 100 объектов, а один объект и 100 ссылок, поэтому проблем с производительностью не будет. –

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