【问题标题】:Javascript - Collection of objects with parent properties in commonJavascript - 具有共同父属性的对象集合
【发布时间】:2016-11-28 23:38:29
【问题描述】:

我想创建一个像数组一样工作的对象集合。前段时间,我发了this question,在帮助我的人的帮助下,我想出了以下解决方案:

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

但是,这会使子级与父级断开连接。例如,假设这个集合有一个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('.......')
}

它应该能够在一页中设置不同的集合,因此为所有Newobj.Collections 设置一个全局container 不是解决方案。这是一个示例,我需要它来处理比 render() 函数更复杂的过程。

任何人都知道如何使数组能够访问它所属的父类?

如果解决方案可以是JSON.stringifyed 并被视为服务器端的数组,那也很好,尽管这不是这个问题的主要问题。现在,如果我为数组设置一个属性,它在服务器端被视为带有size &gt; 0 的对象。

谢谢!

【问题讨论】:

    标签: javascript arrays collections parent children


    【解决方案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('.......')
    }
    

    或在元素选项中没有引用:

    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('.......')
    }
    

    但是这个版本需要有methods参数。

    【讨论】:

    • 没想到。我会对其进行测试,当我看到它是否有效时(当我阅读它时它应该有效),我会将您的答案标记为正确答案!感谢您的帮助!
    • 我想出了一个性能可能的问题。如果我把 collection 作为参数,当我到达那里时,元素编号 100 会发生什么?它会有一个名为 parent 的属性,其中已经有 99 个其他元素吗?而第 99 个,将有一个 parent 属性,其中包含一个包含 98 个元素的数组,等等?
    • 这个参数是对象引用,所以不会是100个对象而是1个对象和100个引用,所以不会有性能问题。
    • 因为它是一个对象(或者它应该),它是通过引用传递的,但我不知道这是否仍会影响诸如JSON.stringify() 之类的操作的性能,它将在其中编码整个父数组。编辑(我们同时写):好的。我会查的!谢谢!
    • 我收到了一个 Uncaught TypeError: Converting circular structure to JSON 因为引用...你知道我可以通过什么方式来完成它而无需实现我自己的序列化方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多