2014-02-13 63 views
0

工作我看了一些關於JavaScript中的書,它是使用OOP構建Web應用程序一個非常強大的語言,但現在我有,我不知道這是否是一個問題可以解決:與Object.defineProperty和「GET」功能

var myObj = {}; 
myObj.properties = {}; 
myObj.properties.myProperty = 'foo'; 

讓我解釋一下,現在我有myObj ..設置好的內properties對象......現在,如果我問 爲myObj.properties.myProperty我會得到foo。但是如果我要求myObj.properties.notSettedValue? (即undefined

我在MDN上看到了關於Object.defineProperty的文章,可以在屬性上設置setter和getter。

我試圖設置myObj.properties

Object.defineProperty(myObj, 'properties', { 
    get : function(){ 
     console.log("called custom get property.", this, arguments); 
    } 
}); 

"get"價值......但無關,宣稱只爲自己myObj.properties工作get功能。自定義功能僅在我請求myObj.properties時纔會調用。不是爲了孩子。

有一種解決方案將請求的myObj.properties.notSettedValue傳遞給函數myObj.properties

(不使用的功能或類似myObj.properties.getItem('notSettedValue')的方法)

回答

0

基本上你要問的是是否有可能建立一個被調用函數,如果代碼試圖從沒有按」對象檢索屬性在那個對象上存在。

不,JavaScript沒有這種能力。 ES6的proxies會使事情變得非常相似,但從ES5開始,沒有「全部捕獲」功能。

你唯一的ES5兼容機制就像你說的那樣,使用函數而不是屬性(您的getItem)。

+0

我懷疑這....雖然有一些JavaScript的「神奇」功能,並非所有的可能現在..十多年來從ES3傳遞到ES5 ......多少次,我們將等待ES6 ? ... – Salcos

+0

@Salcos:不久,我很高興地說。有關人員一起行動起來。你可以看一下(http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts)最新的[爲ES6這裏規範草案。我認爲它不會在2014年完成,但我懷疑它會在2015年,所以這是自5.0和5.1以來的四年後的大約六年。但是與ES5相比,ES6有了很大的變化。 –

0

對象在JavaScript是動態的。您可以即時添加新的屬性,就像您在示例中所做的那樣,例如myObj.properties = {}

在引擎蓋下發生的是解釋器將嘗試在myObj實例上找到名爲properties的屬性;如果沒有這樣的屬性,那麼它將瀏覽原型鏈。在這個例子中,它將訪問Object構造函數的原型,因爲myObj是對象字面值。如果它無法在原型鏈中找到該屬性,那麼它將創建它並將其添加爲對象的新成員。

同樣的,當你想讀一個屬性適用。但是在這種情況下,如果找不到請求的屬性,它將返回undefined;所以除非你明確地定義了屬性,否則它總會返回undefined。這適用於您訪問簡單屬性和ES5屬性的情況。

+0

這不回答這個問題。它只是描述了屬性如何工作,OP似乎已經(大部分)已經理解了。 –

+0

好吧,在我看來,他不明白 – ppoliani

+0

這個問題有點湊合,但它很清楚:有沒有辦法在代碼訪問不存在的屬性時調用某個函數? –