在我的项目中,我需要获取创建第二个对象的另一个实例的对象实例。
我通过在第二个对象的构造函数中发送实例来绕过问题,但我正在寻找更好的解决方案
例如:
第一个对象(父对象)
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
但返回函数而不是实例
我希望我能很好地解释这个问题,我的英语很差!
谢谢
答案 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对象的父级。您的代码似乎很好,但我建议您将变量名称从“父”更改为“聚合器”。