2011-08-19 95 views
0

我剛剛瞭解到這個question中的自引用對象。這真棒,StackOverflow的人們知道JavaScript的每個黑暗角落。JavaScript中的對象繼承概念

今天,我想用我的知識,並在我的代碼中使用自引用對象,但我無法做到。 我試圖做一個自我引用的對象,在不同的級別有不同的值。我希望我的物體的每個關卡都具有我在一級和二級以及二級以下具有的所有屬性的主要屬性,以此類推... 讓我們來看看我想要做什麼:

obj是一個對象,是自參照,這意味着obj.objobj等等... 我想有一個屬性obj.obj但不是在obj,像obj.obj.newProp = "myString",然後在下面兩個級別每個級別應該有newProp 。 這是我寫的代碼,我肯定不是最新的!

var obj = {}, 
    obj.obj = obj, 
    obj.obj.newProp = "myString"; 

但是當我看着obj它包含"myString"。如何防止obj參考obj.obj

+0

如果是自引用,那麼它是完全相同的對象。你不能有一個級別有一個財產,而不是另一個。 (a)我不認爲自我參照在這裏是正確的方法。 (b)繼承是另一回事。 –

回答

4

「我想有一個obj.obj財產,但不是在目標文件」

但他們的同一對象。您不能同時在同一個對象上擁有特定的屬性。

// obj is a reference to__ 
//      | 
var obj = {}; //<---------| 
//  ^
//   |---------------------------------------------- 
//          |    | 
obj.obj = obj; // "obj" is a property on | that refers to | 

編輯:

如果你談論的是繼承,那麼你就需要設置一個對象作爲另一個原型對象。有幾種不同的方法。

如果您只支持現代JavaScript環境,則可以使用Object.create()

var obj1 = { prop1:'value 1' }; 

var obj2 = Object.create(obj1); 

obj2.prop2 = 'value 2'; 

obj1.prop1; // value 1 
obj1.prop2; // undefined 

// obj2 inherits the properties of obj1 through the prototype chain 
obj2.prop1; // value 1 
obj2.prop2; // value 2 

如果需要支持舊的瀏覽器,那麼你可以使用一個構造函數,構造函數的prototype對象設置爲obj1,並從構造函數創建的所有對象都會有obj1在其原型鏈。

function MyConstructor() {} 

var obj1 = { prop1:'value 1' }; 

MyConstructor.prototype = obj1; 

var obj2 = new MyConstructor(); 

obj2.prop2 = 'value 2'; 

obj1.prop1; // value 1 
obj1.prop2; // undefined 

// obj2 inherits the properties of obj1 through the prototype chain 
obj2.prop1; // value 1 
obj2.prop2; // value 2 
+1

如果你把它放在一個盒子裏,你也許能夠;)(但是你不能訪問這個屬性,它可能存在或不存在,你永遠不會知道)。 –

+0

你如何達到我所描述的方法? – Mohsen

+0

@Mohsen:最終取決於你想如何使用它。你指的是* nested *對象,你從另一個對象的屬性訪問不同的對象?還是你想要一個子對象來繼承父對象的所有屬性,這樣就可以引用父對象的屬性,就好像它們是子對象的一部分一樣?你的代碼的最終目標是什麼? – user113716

0

您不能在不同級別有不同的值。由於obj.obj is obj,意思是obj.obj持有對obj的引用,而不是副本,這意味着對obj的任何更改都會更改對它的任何引用。

想象一下一個對象,我們將其稱爲foobarobj均持有對foo的引用。對foo,barobj屬性的任何更改都會改變其他值。例如:

var foo = {}; 
var bar = foo; 
var obj = foo; 
bar.lol = 'mew'; 
bar.lol == foo.lol == obj.lol