2011-03-23 36 views
18

我與XULRunner的工作和代碼示例中遇到下列模式傳來:Javascript有獲取/設置關鍵字像C#嗎?

var StrangeSample = { 

backingStore : "", 

get foo() { return this.backingStore + " "; }, 

set foo(val) { this.backingStore = val; }, 

func: function(someParam) { return this.foo + someParam; } 
}; 

StrangeSample.foo = "rabbit"; 
alert(StrangeSample.func("bear")); 

這將導致「兔子熊」被警告。

我以前從來沒見過在Javascript中使用該獲取/設置模式。它的工作原理,但我找不到任何文檔/參考。這是XUL特有的,最近的語言特徵,還是我錯過的東西?我很困惑,因爲幾個月前我專門尋找這樣的東西,卻找不到任何東西。

僅供參考,刪除「得到」或「設置」中的語法錯誤的結果。將它們重命名爲其他任何內容都是語法錯誤。他們確實似乎是關鍵字。

任何人都可以提供一些線索這光我,或指向我往的參考?

+0

嘆息。詢問後,我立即找到相關鏈接。它是Javascript 1.5: – chinchilla 2011-03-23 17:42:56

+0

它適用於某些版本的Chrome,但最好使用沒有關鍵字的getters/setter。 – 2011-03-23 17:44:10

+1

你可以發佈你在答案中找到的相關鏈接,等待一段時間(這是強制性的),然後接受答案。這將有助於其他人尋找同樣的東西,你可能會得到一些聲望點,並且你會感覺到隨着互聯網更好地發展而產生的溫暖模糊感。 – 2011-03-23 18:00:32

回答

14

正如Martinho建議,這裏有一些鏈接解釋的getter/setter方法在JS 1.5:

http://ejohn.org/blog/javascript-getters-and-setters/

http://ajaxian.com/archives/getters-and-setters-in-javascript

要知道,雖然,他們似乎並不在IE中支持,而且一些開發人員對變量賦值有副作用的想法有(合理的)關注。

的get/set不保留的關鍵字作爲丹尼爾指出。我沒有問題創建一個稱爲「get」和「set」的頂級函數,並使用上面貼出的代碼示例。所以我認爲解析器足夠聰明以允許這樣做。事實上,即使下面似乎是合法的(如果混淆):

var Sample = { 
    bs : "", 
    get get() { return this.bs; }, 
    set get(val) { this.bs = val; } 
} 
+0

哇,實際解析'set get'的方式? – Pacerier 2014-06-05 05:57:12

0

的JavaScript getter和setter方法:

通常setter和getter方法遵循JavaScript對象的語法如下。一個對象用多個屬性創建。 setter方法有一個參數,而getter方法沒有參數。兩者都是功能。

對於已經在對象內創建的給定屬性,set方法通常是一個if/else語句,該屬性直接訪問並隨後通過代碼a.k.a.「set」分配,隨時驗證輸入。這通常是通過使用if(typeof [arg] ==='某種類型的值,例如:number,string或boolean')語句來完成的,那麼代碼塊通常會分配這個。(特定)屬性名稱到論點。 (有時用消息記錄到控制檯。)但它不需要返回任何東西;它只是設置這個特定屬性來評估參數。然而,else語句幾乎總是在控制檯上有一個(錯誤)消息日誌,提示用戶爲符合條件的屬性鍵值輸入一個不同的值。

基本上,getter方法是相反的。它建立一個沒有任何參數的函數來「獲取」,即當你調用你剛纔設置的特定屬性時返回一個(nother)值/屬性。它「獲取」了與通常調用該對象屬性時所獲得的結果不同的東西。

對於不想直接修改的屬性鍵值,可以很容易地看到setter和getter的值,除非滿足某些條件。對於此類型的屬性,請使用下劃線繼續屬性名稱,並使用getter來允許您在不使用下劃線的情況下調用屬性。然後使用setter來定義可以訪問和分配該屬性的鍵值的條件,即a.a.「set」。例如,我將爲這個對象的屬性包含兩個基本的setter和getters。注:我使用一個常量變量,因爲對象保持可變(創建後)。

const person = { 
_name: 'Sean'; 
_age: 27; 

set age(ageIn) { 
if (typeof ageIn === 'number') { 
    this._age = ageIn; 
} 
else { 
    console.log(`${ageIn} is invalid for the age's key-value. Change ${ageIn} to/into a Number.`); 
    return 'Invalid Input.'; 
} 
}, 

get age() { 
return this._age; 
}, 

set name(nameIn) { 
if (typeof nameIn === 'string') { 
     this._name = nameIn; 
     } else { 
     console.log(`Change ${nameIn} to/into a(ny) String for the name's 
key-value.`); 
     return 'Invalid Input.'; 
    } 
}, 

get name() { 
return this._name; 
} 

}; 

它有趣的是,當你嘗試設置/分配的_age財產新的鍵值,因爲它滿足了,如果條件才能被成功分配,這意味着並不是所有的任務都有效等。

person.age = 'twenty-eight'; /* output: twenty-eight is invalid for the 
age's key-value. Change twenty-eight to/into a Number. */ 
console.log(person.age); // output: 27 (twenty-eight was never assigned) 
person.age = 28; // output: none 
console.log(person.age); // output: 28 

請注意我是如何通過getter方法通過person.age屬性訪問person._age屬性的。另外,與年齡限制僅限於數字的輸入類似,name屬性的輸入現在僅限於/設置爲字符串。

希望這有助於澄清事情! 此外,一些鏈接,瞭解更多:

https://johnresig.com/blog/javascript-getters-and-setters/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

https://www.infragistics.com/community/blogs/infragistics/archive/2017/09/19/easy-javascript-part-8-what-are-getters-and-setters.aspx

相關問題