2013-12-11 96 views
4

閱讀John Resig's article about Javascript getters and setters我在Javascript中看到的結構我不熟悉:什麼類型的對象/屬性是原型getter和setter?

Field.prototype = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val; 
    } 
}; 

原型是許多人一樣,但get和set部分在這裏對象顯得陌生。他們以什麼名字提到?它們看起來不像對象的典型屬性(遵循"key":"value"語法),它們看起來也不像標準函數。

這是簡單的JS引擎轉換成更容易識別的語法糖嗎?

更新:

我的問題的真正癥結是:由於{ foo(){} }是無效的語法,是什麼使得它有效給予getset操作? { get foo(){} }

+1

「get」和「set」都在* operators *文檔的MDN上列出。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get。他們也把他們稱爲獲得者和制定者。我想他們和'delete' /'typeof' /'yield'運算符很相似。 – CodingIntrigue

+0

啊,我知道的那一天,我覺得有點骯髒。這些應該永遠不會存在,海事組織。 – ZenMaster

+0

謝謝@Rraham。我剛剛在MDN上找到了get運算符的一些信息。接下來的部分實際上是如何適合對象文字符號的。他們被視爲特殊情況還是語法實際上符合標準? –

回答

4

我花了一點時間來研究如何使用它,所以@RGraham指出了一些文檔(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get),我想我會提供一個用法示例。

基本上,「get」和「set」運算符允許您覆蓋直接訪問成員變量時將獲得的行爲。

這意味着你可以,例如:

  • 目前有一個公開名稱的成員變量,然後將其與另一名存儲私人。
  • 在存儲之前對值執行操作。
  • 呈現看起來是成員變量的東西,而事實上,它是一個函數。

所有上述都可以(當然)通過在對象上定義函數來完成,不同之處在於必須像這樣調用函數。

使用此表示法,即使表示法似乎引用成員變量,也會調用函數。

我個人不喜歡它 - 我想它會導致一些非常混亂的代碼,特別是在調試時。但它的存在被使用,如果你想...

var Field = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val + 1; 
    } 
}; 

Field.value = 100 

console.log(Field.value); 

將輸出:

101 

小提琴這裏:http://jsfiddle.net/zV8Kf/1/

上到特定的「爲什麼{ get foo(){} }有效嗎?「問題:

我看這是:

  • 創建一個對象
  • 定義,什麼也不做
  • 分配功能的功能,使這是‘富’
吸氣

這意味着對該物體的foo的引用將返回undefined

你可以在這裏看到的行爲:

http://jsfiddle.net/VHAhA/

如果您認爲get爲近似foo: function(我知道這是不大,但它的狀態:「我要定義一個函數 - 它分配給這個」,那麼它在語法上是相似的:

{ foo: function foo() {} } 

它不能相比{ foo(){} },在這個例子中,你不告訴JavaScript的,你是要定義的東西,也不是把它放在哪裏,一旦你做。

+0

Hi Rob。感謝您花時間回答我的問題。實際上,我確定語法的目的和用法。我知道它是如何工作的以及它可以用於什麼,所以我的問題仍然是關於與其他對象相比語法上的差異。既然'{foo(){}}'是無效的,爲什麼它對'get'運算符有效? –

+0

我不確定你的意思。你能否用更完整的「這是無效的」例子來更新原始問題 - 「這是有效的」 - 「爲什麼?」 –

+0

看到我的更新,羅布。 –