2013-02-13 163 views
1

我如何獲得父級選項?Javascript訪問父級屬性

我想訪問

var myObject = {  
    method: function(){ 
    this.options = {}; 
    },  
    property: {  
    propertyMethod: function(){ 
     alert(this.options); 
    }  
    }  
}  
myObject.method(); 
myObject.property.propertyMethod(); 
+3

一般來說,你不能這樣做。但是如果'myObject'是全局的,那麼你總是可以在子對象中執行'myObject.options'。 – freakish 2013-02-13 16:16:20

+0

@freakish:(稍微擴大)是*答案*。 – 2013-02-13 16:16:50

+0

@ T.J.Crowder是的,其實我並不是100%確定的,所以我決定對它進行評論。 :) – freakish 2013-02-13 16:19:26

回答

3

如果你的意思,你想從property.propertyMethod中訪問myObjectoptions財產全球myObject的選項,有沒有辦法做到這一點,除了採取的事實的優點:這propertyMethod是在myObject變量,例如關閉:

var myObject = {  
    method: function(){ 
    this.options = {}; 
    },  
    property: {  
    propertyMethod: function(){ 
     alert(myObject.options); // <=== Change is here 
    }  
    }  
}  
myObject.method(); 
myObject.property.propertyMethod(); 

...這通常不是一個好主意。 :-)相反,你可能想要以不同的方式設計你的對象。例如:

var myObject = (function() { 
    var obj = { 
    method: function(){ 
     obj.options = {}; 
    },  
    property: {  
     propertyMethod: function(){ 
     alert(obj.options); 
     }  
    }  
    }; 
    return obj; 
})(); 
myObject.method(); 
myObject.property.propertyMethod(); 

這樣,您正在使用函數調用的執行上下文。但是如果你打算這麼做的話,也許可以採取下一步:

function makeObject() { 
    var obj = { 
    method: function(){ 
     obj.options = {}; 
    },  
    property: {  
     propertyMethod: function(){ 
     alert(obj.options); 
     }  
    }  
    }; 
    return obj; 
} 
var myObject = makeObject(); 
myObject.method(); 
myObject.property.propertyMethod(); 

......所以你可以做多個。甚至使一個真正的構造函數:

function MyObject() { 
    var obj = this; 

    obj.method = function(){ 
    obj.options = {}; 
    };  

    obj.property = {  
    propertyMethod: function(){ 
     alert(obj.options); 
    }  
    }; 
} 
var myObject = new MyObject(); 
myObject.method(); 
myObject.property.propertyMethod(); 

...雖然因爲你沒有充分利用的原型,也沒有太多的理由,使之成爲構造函數。

+0

謝謝,這是一個很好的解釋,但你會用什麼方法? – xavip 2013-02-13 16:49:31

+0

@ user634177:這取決於您的需求。如果你只需要這些對象中的一個,可能是第二個(使用匿名製造商功能)。如果你需要不止一個,我可能會重構一下,並使用構造函數(但不是每個人都喜歡構造函數,'makeObject'版本也不錯)。 – 2013-02-13 16:53:03

+0

@ user634177:當然,如果你不介意'myObject'是全局的,你可以像第一個例子那樣使用'myObject'。如果您的聲明不在全局範圍內,只需將其更改爲'window.myObject ='而不是'var myObject ='。 – 2013-02-13 17:13:59

1

您可以使用call綁定thismyObject

myObject.property.propertyMethod.call(myObject);