如何获取实例的父级

时间:2013-05-26 03:20:49

标签: javascript oop

在我的项目中,我需要获取创建第二个对象的另一个实例的对象实例。

我通过在第二个对象的构造函数中发送实例来绕过问题,但我正在寻找更好的解决方案

例如:

第一个对象(父对象)

    function AnimalsList()
    {
            var _list = new Array();
            this.List = _list;

            this.Add = function(name)
            {
                    _list.push(new Animal(name),this);
            }
    }

第二个对象(孩子)

    function Animal(name, parent)
    {
            this.Name = name;

            this.GetList = function()
            {
                    return parent
            }
    }

我知道在这种情况下,“GetList”函数在第一个对象中包含更多逻辑,但只是一个例子。

我尝试使用this.constructor但返回函数而不是实例

我希望我能很好地解释这个问题,我的英语很差!

谢谢

5 个答案:

答案 0 :(得分:0)

为什么不呢:

function Animal(name, parent)
{
        this.Name = name;
        this.List = parent;
}

我怀疑你想写:

_list.push(new Animal(name,this));

而不是你在那里。

答案 1 :(得分:0)

您可以通过功能caller property获取此信息。它不是ECMAScript标准的一部分,但它得到了所有主流浏览器的支持。

然而,以你现在的方式继续这样做可能是一个更好的主意。您当前的方法更明确,并且不会将程序的函数调用结构直接绑定到动物对象的属性,这可能是更好的模型。

答案 2 :(得分:0)

这个怎么样:

function AnimalsList()
{
        var _list = new Array();
        this.List = _list;

        function getList() { return _list; } 

        this.Add = function(name)
        {
           var obj = { Name:name, GetList:getList };
           _list.push(obj);
           return obj;
        }
}

然后?

答案 3 :(得分:0)

我建议不要在父列表上使用带有引用的构造函数,如下所示:Animal(name, parent)。因为动物不应该知道List。这是一个说明动物的名单“嘿,老兄!你在我的收藏中。”所以,我的小修改:

function Animals()
{
    var __list = new Array();

    this.List = __list;

    this.Create = function(name){
        return this.Add(new Animal(name));
    }

    this.Add = function(animal){
        animal.__parent= this;
        __list.push(animal);
        return animal;
    }

    Animals.Parent = function(animal){
        return animal.__parent;
    }
}

function Animal(name)
{
    this.Name = name;
}

示例:

var animalsLikeDogs = new Animals();
var dog = animalsLikeDogs.Create("dog");

var animalsLikeCats = new Animals();
var cat = animalsLikeCats.Create("cat");

Animals.Parent(dog);
Animals.Parent(cat);

答案 4 :(得分:0)

从概念上讲,AnimalList是一个聚合器,而不是Animal对象的父级。您的代码似乎很好,但我建议您将变量名称从“父”更改为“聚合器”。