2016-05-24 63 views
0

我真的試圖打破setters和getters來理解他們。 我認爲,如果有一個條件的制定者可採用:使用setters和getters

var Temperature = {} 
 
Temperature.closure = null 
 
var init = {} 
 
init.get = function() { 
 
\t return this.closure 
 
} 
 
Object.defineProperty(Temperature, "b", init) 
 
init = {} 
 
init.set = function(arg) { 
 
\t if (arg > -459.67) { // sanity check to make sure it's above 0 degrees Kelvin 
 
\t \t this.closure = arg 
 
\t } 
 
} 
 
Object.defineProperty(Temperature, "c", init) 
 

 
console.log(Temperature.b); // null 
 
Temperature.c = 32; 
 
console.log(Temperature.b); // 32 
 
Temperature.c = -5000 
 
console.log(Temperature.b); // still 32

我希望做的是擺脫了.B和.C讓我可以的只是說

Temperature = 32 

console.log(Temperature) 
+1

您想'溫度= 32'做究竟是什麼? –

+0

我想知道你的兩個屬性是否共享相同的init對象,這可能是一個問題。當使用'defineProperty'時,你可以(也應該)直接傳遞一個對象字面值:'Object.defineProperty(Temperature,「b」,{get:function(){}})' –

+1

@RocketHazmat它們沒有共享同一個對象。 –

回答

0

var obj = { 
 
\t get temperature() { 
 
\t \t return this.value 
 
\t } 
 
\t ,set temperature(arg) { 
 
\t \t if (arg > -459.67) { 
 
\t \t \t this.value = arg 
 
\t \t } 
 
\t } 
 
} 
 
obj.value = null 
 

 
console.log(obj.temperature) // null 
 
obj.temperature = Math.PI 
 
console.log(obj.temperature) // 3.141592653589793 
 
obj.temperature = -5000 
 
console.log(obj.temperature) // 3.141592653589793

+0

你感到困惑的是[他們的例子](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters),他們在應該使用b和c時兩者都使用了相同的名稱。 –

5

tl; dr:你不能。

要使用setters和getters,您需要擁有某個屬性。如果使用var,letconst的本地作用域變量,那麼您將無法附加(相當於)用於覆蓋該變量的偵聽器,因爲該變量本身已被完全替換爲新的引用。


作爲替代局部變量:

如果你在一個對象的情況下使用Temperature,你可以選擇通過this.temperature,而不是一個本地變量使用該對象的屬性。


如果你堅持要用一個局部變量,你可以考慮建立一個更加複雜的Temperature對象,它的屬性設置一個值,但也有一個valueOf方法使其轉化成一個數字:

function Temperature(kelvin) { 
    this._internalValue = kelvin || 0; 
} 

Temperature.prototype = { 
    get kelvin() {...} 
    set kelvin(val) {...} 
    get celsius() {...} 
    set celsius(val) {...} 
    get farenheit() {...} 
    set farenheit(val) {...} 
    valueOf: function() { 
    return this._internalValue; 
    } 
} 

你仍然需要使用屬性賦值:

var temperature = new Temperature(); 
temperature.celsius = 0; 

但你可以再直接從OBJE得到的數值CT:

console.log(+temperature); 
//  ^cast to a Number