2013-07-09 45 views
2

我想知道是否有可能從一個對象訪問其父項的屬性,下面是一個明確的例子,假設我們在Group對象中有一個People對象的數組。如何訪問父對象屬性?

在此Group對象,每個People有相同的地址,所以這將是很好宣佈它在Group而不是在每個People對象,但如何在不解析集合訪問它?

function Group() { 
    this.address = 'EveryWhere'; 
    this.Collection = []; 
} 

function People(data) { 
    this.name = data.name; 

    this.getAddress = function() { 
    return this.address; //how to access it (declared in the Group object)? 
    } 
} 

var Serie = new Group(); 
var John = new People(); 
Serie.Collection.push(John); 
console.log(John.getAddress()); 
+0

模仿繼承通過家長參考'新人(數據,系列)'和'功能人(數據,serieRef){this.parent = SerieRef' – rab

+1

幾個樣式點:1.通過約定, l函數在JavaScript中用於構造函數,因此'函數Group()'是好的,但是'this.Collection = [];','var Serie'和'var John'很奇怪,因爲它們不是構造函數。 2.對於構造函數,'Person'可能比'People'更好,因爲它看起來像用它來創建一個人,而不是一些人。 –

回答

1

您可以通過分配新Group對象爲People.prototype

function Group() { 
    this.address = 'EveryWhere'; 
    this.Collection = []; 
} 


function People(data) { 
    this.name = data.name; 

    this.getAddress = function() { 
    return this.address; //how to access it (declared in the Group object)? 
    } 
}; 

People.prototype = new Group(); 

var Serie = new Group(); 
var John = new People({name:"John"}); 
console.log(John.getAddress()); 
+1

這是個好主意嗎?設置一個原型繼承類型意味着(某些被稱爲奇怪名稱)的人也是一個組 - 它將擁有它自己的Collection數組和所有內容。這似乎不是原始海報想要的。 – AHM

2

與許多語言相同:將父項傳遞給子項的構造函數,以便您可以持有對它的引用。

function People(data, parent) { 
    this.parent = parent; 
    this.getAddress = function() { 
     return this.parent.address; 
    } 
} 

,增強安全性,您可以在父添加一個方法來添加子:

function Group() { 
    // ... other code ... 
    function addPeople(data) { 
     this.collection.push(new People(data, this); 
    } 
} 
+0

這創建了一個循環依賴。 – Adam

+0

@亞當:這是怎麼回事? 'Group'不依賴於'People',是嗎? –

+1

好吧,是的,集團將有一個人的集合(我將它重命名爲Person),一個People對象將有一個集團的參考。但這不是一個真正的問題(不像.NET中的循環引用)。實際上,它經常被使用,有時也被稱爲雙向關係(特別是在ORM圈中,它常常用於集合,即在NHibernate中)。 – Peter