2013-04-26 21 views
3

我已經搜索了很多關於如何在Javascript中使用屬性的方法。我見過的大多數揭示模塊模式都具有專門公開的功能,並且根據經驗我知道如果我暴露一個對象,我只是真的在那裏獲得一個值的副本,然後我就可以擁有一個函數getMyThing()和setMyThing並公開。不過我想揭露不動產使用Html5獲取器和設置器實現具有揭示模塊模式屬性所需的清晰度

我見過的舊校園defineGetter這我回避和新Object.defineProperty(我有一些真正的麻煩與。(我可以輕鬆地使用它對抗artitary對象,但不是這裏面我的「模塊」,也不是我的模塊裏面,我想透露一個屬性。

var myobj = (function() { 
    var name = "default name" 
    var sayName = function() { return "hello " + name } 
    return { 
    badname : name, //this won't change 
    sayName : sayName, 
    get name() { return name;}, 
    set name(value) { name = value ;} 

    } 
})() 
alert("should be default because its just a copy: " + myobj.badname) 
alert("should be default: " + myobj.name) 
myobj.name = "karl" 
alert("should be default because its just a copy: " + myobj.badname) 
alert("should be karl: " + myobj.name) 

無論如何,我看到,你可以使用get和set關鍵字的幾個地方,我有以下的例子是至少在Firefox和IE10中工作。

我的問題:是否這是一種可以接受的方法,或者是我不知道的隱藏的陷阱。這是現代瀏覽器最爲接受的方法嗎? 這個功能叫什麼?以及Object.defineProperty功能的官方名稱是什麼? 我假設get和set關鍵字的使用是ECMAScript5 getters和setters,但是另一個叫做什麼?

並且是在兼容性圖表http://kangax.github.io/es5-compat-table/中的屬性初始值設定項中的「Getter」和「屬性初始值設定項中的Setter」類別中提到的get和set關鍵字?

例如上的jsfiddle - http://jsfiddle.net/klumsy/NagbE/1/

+0

這個問題,因爲它代表是有點不清楚 - 你可能需要將其收緊(問題說「這是好的嗎?」通常會關閉) – slifty 2013-04-26 00:45:57

+0

可能的重複[是否有像C#那樣的獲取/設置關鍵字?](http://stackoverflow.com/questions/5409372/does-javascript-have-get-set-keywords -like-c) – 2015-11-08 22:21:59

回答

1

模式你用看起來很不錯。它將受到所有ES5瀏覽器的支持。

對象文字內部的getset語法經常被稱爲ES5 對象常量擴展用於限定存取性能。訪問者屬性是由獲取者和/或設置者組成的屬性。對於不屬於獲取/設置者的傳統類型財產而言,其數據屬性爲

而且,是的,這就是kangax的兼容性表所指的「...屬性初始值設定項」(如果將鼠標懸停在該頁面上的圓周圍的灰色「c」上,您可以看到正在運行的實際測試)。

Object.defineProperty提供的元屬性特徵被稱爲屬性描述符。有兩種類型的屬性描述符在ES5:數據描述符訪問描述符,這是由以下的描述符的性質:


數據描述符valuewritableenumerableconfigurable

實施例:

Object.defineProperty(obj, 'prop', { 
    value: 'some value', 
    writable: true, 
    enumerable: false, 
    configurable: true 
}); 

訪問者描述getsetenumerableconfigurable

例子:

Object.defineProperty(obj, 'prop', { 
    get: function() { return 'foo'; }, 
    set: function() { /* do something... */ }, 
    enumerable: false, 
    configurable: true 
}); 
+0

不錯但是,儘管這不是他的問題,但它爲什麼OP在'defineProperty'中使用'this'有困難。 – ProfK 2014-12-10 08:34:30