2016-02-11 57 views
1

我知道,获取当前对象的父对象是一个旧主题,但是,我对提供的解决方案提供了一个问题来解决此问题。大多数我已经找到了答案,说简单地创建其设置为父对象的子对象中的属性。如果在子对象中创建对父对象的引用会创建一个循环关系,那么这怎么能成为一个有效的解决方案呢?下面是说明这种解决方案的例子 -是否创建子对象中,以父对象的引用导致循环关系?

var obj = { 
    innerObj: {}, 
    setParent: function(){ 
     this.innerObj.parent = this; 
    } 
}; 
obj.setParent(); 

这样做的结果将创建一个对象,它看起来像这样 -

obj.innerObj.parent.innerObj.parent.innerObj ......,只是不断去。

我一直在寻找不同的解决方案。如果我们有过怎样的对象被创建,然后控制一个可能的解决办法是这样的 -

var obj = function(that){ 
    that = that || this; 
    var o = { getParent: function(){ return that; } }; 
    return o; 
}; 

现在,当您创建一个新的对象,你可以简单地传递要返回的父对象并且不创建循环类型的关系。

例子:

var myObj = obj(); 
myObj.myInnerObj = obj(myObj); 

var parentObj = myObj.myInnerObj.getParent(); // parentObj = myObj 
+0

为什么你认为循环关系是一个问题?没有任何东西会自动追踪对象之间的所有链接。 – Barmar

+0

@Barmar这是另一个很好的问题。而且我认为,从我读过的这个小角度来看,这种循环关系可能有几个潜在的问题。这是一个链接到一个页面,具体谈到为什么这可能是一件坏事。 http://programmers.stackexchange.com/questions/11856/whats-wrong-with-circular-references – usr56777

+0

这并非天生不好,它只是有可能变坏。像编程中的许多选项一样,这取决于您如何使用它。 – Barmar

回答

1

要回答简单地说,是的,它确实会导致循环关系。然而,这不是一个问题。只要你不那么写它试图无限抓取下来的那些对象的功能,有这种模式没有问题。

这样的一个例子是Backbone.js,其具有由模型组成的集合。每个模型都有一个参考集合,其中有模型在他们内部等。

这在实践中完美的罚款。

+0

好吧,我会接受这个答案,因为我已经找到了几个职位,其指出,在某些情况下,循环的关系是有益的。而且,我仍然认为,在这种特殊情况下,如果简单地创建一个新的对象,并希望能够轻松地获得其父更安全的解决方案(如我的例子)是一样容易,不需要一个循环关系,使这行得通。但是,我一定知道是错误的:)。 – usr56777