在子对象中创建对父对象的引用是否会导致循环关系?

时间:2016-02-11 22:40:09

标签: javascript

我知道获取当前对象的父对象是一个古老的主题但是,我对解决此问题所提供的解决方案有疑问。我发现的大多数答案都只是在子对象中创建一个属性,该属性设置为父对象。如果在子对象中创建对父对象的引用会创建循环关系,那么这怎么可能是一个有效的解决方案呢?这是一个说明此解决方案的示例 -

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

1 个答案:

答案 0 :(得分:1)

简单回答一下,是的确会导致循环关系。然而,这不是任何问题。只要你没有编写一个试图无限地爬下这些对象的函数,这个模式就没有问题。

其中一个例子是Backbone.js,其中包含由模型组成的集合。每个模型都有对集合的引用,集合中包含模型等。

这在实践中完美无缺。

相关问题