2013-04-28 100 views
5
var o, d; 

o = { get foo() { return 17; } }; 
d = Object.getOwnPropertyDescriptor(o, "foo"); 
// d is { configurable: true, enumerable: true, get: /*the getter function*/, set:  undefined } 

對象內部的那個get是做什麼的?這是一種方法或財產或別的東西? 它是如何工作的或它如何設置屬性或方法來反對?如果我簡單地忽略了使用getset,那麼我會陷入麻煩嗎?使用getset比僅僅定義沒有使用的屬性更有優勢。有什麼優點(如果有的話)。.getOwnPropertyDescriptor()方法返回什麼?如果它返回對象,我可以簡單地使用returnedobj.configurable來訪問可配置的屬性值嗎?在文字對象中創建屬性

回答

4

get定義了一個屬性存取器函數。當ofoo屬性的值被檢索,雖然它並不像在代碼的函數調用該函數甚至稱,如:

var a = o.foo; // Note that `foo` doesn't have() after it, it's not a function call 

在這種情況下,它總是返回17,但它可以做其他的事情。例如,考慮一個圓圈:

var circle = { 
    radius: 7, 
    get circumference() { return 2 * Math.PI * this.radius; }, 
    get area()   { return Math.PI * this.radius * this.radius; } 
}; 
console.log(circle.circumference); // 43.982297150257104 
console.log(circle.area);   // 153.93804002589985 
circle.radius = 4; 
console.log(circle.circumference); // 25.132741228718345 
console.log(circle.area);   // 50.26548245743669 

正如你可以看到,當我們訪問我們與存取定義的兩個屬性,分配給他們的函數被調用,即使屬性訪問看起來並不像一個函數呼叫。

您也可以在設置爲時調用函數。不出所料,您使用set而不是get來做到這一點。 :-)

您可以在規範的object initializers部分和on MDN中閱讀更多信息。

Object.getOwnPropertyDescriptor調用返回描述您請求的屬性的對象(在本例中爲foo)。你可以閱讀更多關於它in the specon MDN以及。

從MDN引用:

的屬性描述符是記錄(TJC:例如,對象)一些以下屬性:

value
與屬性(僅相關聯的數據描述符的值)。
writable
true當且僅當與該屬性相關聯的值可能被更改(僅限數據描述符)。
get
作爲屬性吸氣劑的功能,或者如果沒有吸氣劑(僅存取器描述符),則爲undefined
set
一個函數,用作屬性的setter,或undefined如果沒有setter(僅用於存取器描述符)。
configurable
true當且僅當該屬性描述符的類型可能會改變,並且該屬性可能從相應的對象中刪除。
enumerable
true當且僅當在枚舉相應對象上的屬性期間顯示此屬性。

+0

downvoter會分享爲什麼這是「無用」嗎? – 2013-04-28 16:47:56

+1

據我所知,看起來是正確的。 +1 – 2013-04-28 16:48:51

2

get是用於定義屬性獲取器和設置器的ECMAScript 5語法的一部分。

使用對象文本語法,它的定義是這樣的:

var obj = { 
    __other_property__: null, 
    get foo() { return "bar"; }, 
    set foo(v) { this.__other_property__ = v } 
}; 

這讓你做對物業獲取時調用獲取函數體。

obj.foo = "oof"; 
console.log(obj.foo); // "bar" 
console.log(obj.__other_property__); // "oof" 

上述用途foo設置一個不同的屬性__other_property__。這可能是一個局部變量或其他東西,並且這些函數顯然可以完成比我在這裏展示的操作複雜得多的操作。

+0

謝謝你關於下一個問題的問題先生 – 2013-04-28 16:46:24

+0

@Maizere:是的,它返回一個可訪問屬性的對象。我想你一旦嘗試過就會發現。 – 2013-04-28 16:48:07

+0

我很害怕嘗試,無論如何謝謝你。也可以幫助我「set」做什麼?當我們設置值 – 2013-04-28 16:49:55