2015-10-15 182 views
0

我有一个Campaign对象,其中包含一个campaign_offer数组属性,其中包含N CampaignOffer子项。Javascript从子方法访问父属性

我的目标是访问每个CampaignOffer对象内的Campaign对象。

为了达到这个目的,我在CampaignOffer对象中添加了一个parent属性,其中包含Campaign对象。

// Parent 
var Campaign = function (properties) { 
    this.id = properties.id || null; 
    this.campaign_offer = []; 
}; 

// Parent: Add a new child in array of children 
Campaign.prototype.addOffer = function (offer) { 
    // Pass the parent reference to the child 
    offer.parent = this; 

    this.campaign_offer.push(offer); 
}; 

// Child 
var CampaignOffer = function (properties) { 
    this.name = properties.name || null; 
    this.parent = properties.parent || null; 
}; 

// --------------------------------------------- 

// Create the parent 
var campaign = new Campaign({ id: 1 }); 

// Create the child 
var campaign_offer = new CampaignOffer({ name: 'test' }); 

console.log('Offer without parent', campaign_offer); 

// Add the child to the parent 
campaign.addOffer(campaign_offer); 

console.log('Offer with parent', campaign_offer); 

你可以看到有结果:Fiddle

的问题是,当您浏览的第二console.log()。你可以发现太多的递归。像:

parent.campaign_offer[0].parent.campaign_offer[0].parent.campaign_offer[0]... 

我明白这个输出,但不知道如何避免这种情况。如何定义最大深度?

顺便说一句,它不会造成无限循环。

+5

您的对象具有彼此的引用 - 每次展开属性时,都会看到相同的引用。这不是一个问题 - 你必须明白,当你检查东西的时候它会发生。 –

+3

为什么relationshp必须是双向的?我明白了为什么'CampaignOffer'可能需要引用一个'Campaign'对象,但我看不到任何相反的理由。 (我也称之为'campaign'而不是'parent',但这是一种风格的东西。)你*可以做到这一点,除非你编写试图遍历它的代码并且不理解它可能会是无害的回圈,但我没有看到任何需要。 –

回答

2

我明白这个输出,但不知道如何避免这种情况。如何定义最大深度?

你不必多深处这里,说话的,你只需要一个循环引用:被罚款提供

 
    /---------------------------------------------------------------------\ 
    | +----------------+             | 
    +->| campaign |             | 
    +----------------+             | 
    | id: xxx  |   +----------+       | 
    | campaign_offer |-------->| (array) |       | 
    +----------------+   |----------+  +----------------+ | 
           | 0  |------->| campaign_offer | | 
           +----------+  +----------------+ | 
                | name: xxx  | | 
                | parent   |--/ 
                +----------------+ 

循环引用你不写代码遍历他们是不知道它们可能存在,因为该代码可能会永远循环。

我没有看到任何在这种情况下,需要为一体,它似乎像CampaignOfferCampaign是有道理的,但我看不出有任何指向相反的(在campaign_offer阵列)。但是,再一次,没关系,只是不要编写代码来试图追随它们到最后,因为它们没有结束。

+1

有一个upvote只是ascii图... –

+0

@JamesThorpe :-)爱我一些ASCII艺术。 –

+0

谢谢老兄和所有回复! :) – Syl