2015-12-28 123 views
1

對於下面的語法JavaScript語法澄清

a = { 
    get p() { 
     alert(1) 
    } 
}; 
alert(a.p); 

它提示我1,比undefined。 對於

a = { 
    set p(x) { 
     alert(x) 
    } 
}; 
alert(a.p); 

它提示我未定義。

我不完全理解的行爲, 什麼

a = { 
    get p() { 
     alert(1) 
    } 
} 

and 

a = { 
    set p(x) { 
     alert(x) 
    } 
}; 

是什麼意思?

+0

方法'p'不返回任何值,這就是爲什麼第二個警報給你undefined – DarkBee

回答

1

有兩種類型的對象屬性:data屬性和accessor屬性。
訪問者屬性可通過getterssetters訪問。 您的對象a旨在用作訪問器屬性的對象,其名稱爲p。 通常情況下,這些對象在以下方式聲明:

a = { 
    _p: 'my value', // intended as private 
    get p() { 
     return this._p; 
    }, 
    set p(x) { 
     this._p = x; 
    } 
}; 

console.log(a.p); // gives 'my value' 
a.p = 'new value'; 
console.log(a.p); // gives 'new value' 

另一種方法是使用Object.defineProperty()方法,可讓您將所有需要的屬性屬性。像這樣:

var a = {p: 'my value'}; 
    Object.defineProperty(a, 'p', { 
     get: function() { return this.p; }, 
     set: function(newValue) { this.p = newValue; }, 
     enumerable: true, 
     configurable: true 
}); 
1

因爲p()方法沒有返回,因此它返回undefined

如果你

a={get p(){alert(1); return 2;}}; 
alert(a.p); 

它會提醒1然後2因爲這p()方法返回2

1

[編輯] - 你改變你原來的問題,所以這個答案不包括一切。

pgetter函數 - 只要您訪問p屬性,就會調用它。在你的getter你有alert(1)

getter函數不返回任何內容。因此,pundefined。所以alert(a.p)警報undefined

因此,你的程序做:

  • a.p獲得價值:alert(a.p)
  • 呼叫p getter函數。其中已alert(1)
  • p getter函數沒有返回
  • 因此alert(a.p)警報undefined
1
{get p(){alert(1)}} 

這是有對象的getterp

當您使用a.p它將使用消氣劑檢索一些值

所以當你做alert(a.p);它首先調用getter,所以提醒1,然後提醒返回值undefined