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

Does creating a reference to parent object within the child object cause a cyclic relationship?

本文关键字:对象 是否 循环 关系 引用 创建      更新时间:2023-09-26

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

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

简单地回答,是的,它确实会导致循环关系。但是,这无论如何都不是问题。只要你不编写一个试图无限爬取这些对象的函数,这种模式就没有问题。

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

这在实践中非常有效。