2013-05-26 62 views
1

的父母我需要獲取創建第二個對象的另一個實例的對象的實例。我怎樣才能得到我的項目中的實例

我在第二對象的構造函數發送的情況下繞過這個問題,但我正在尋找一個更好的解決方案

例如:

的第一個對象(父)

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

請提供小提琴 – Abilash

+0

你看起來不錯。其他解決方案將取決於您需要的父母以及在哪裏。 – bfavaretto

+0

不要忘記標記答案! – Warlock

回答

0

爲什麼不只是這一點:

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

而且我懷疑你想寫:

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

,而不是你有什麼就有什麼。

0

您可能通過函數的caller property獲取此信息。它不是ECMAScript標準的一部分,但它受到所有主流瀏覽器的支持。

但是,現在繼續按照現在的方式繼續操作可能是一個好主意。你當前的方法更加明確,並且不會將程序的函數調用結構直接綁定到動物對象的屬性上,這可能是一個更好的模型。

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; 
     } 
} 

呢?

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); 
+0

由於'Animal'實例具有'Parent'屬性,因此構造函數不應該是它設置的位置嗎?你實際上在概念上建議的是完全刪除該屬性。 –

+0

其實你可以刪除Parent屬性。我現在會做這些改變。 – Warlock

+0

@JanDvorak,你現在喜歡嗎? – Warlock

0

概念, AnimalList是一個聚合器,而不是Animal對象的父類。你的代碼看起來很好,但我建議你將變量名從'parent'改爲'aggregator'。