屬性的特性

什么是屬性晌砾?

屬性是對象的成員,由名/值對組成担忧,值可以是單純的原始數(shù)據(jù)類型芹缔,也可以是對象、方法一樣的引用數(shù)據(jù)類型瓶盛。
每個屬性(property)上還有一些特性(attribute),這些特性決定了這個屬性是存取器屬性還是數(shù)據(jù)屬性最欠。

數(shù)據(jù)屬性

數(shù)據(jù)屬性有四個特性,分別是值(value)惩猫、可寫性(writable)芝硬、可枚舉性(enumerable)和可配置性(configurable)

  • value:屬性的值
  • writable:布爾值,默認(rèn)為true
    • 為false時(shí)該屬性的值無法被設(shè)置
  • enumerable:布爾值轧房,默認(rèn)為true
    • 為false時(shí)無法被for in 循環(huán)枚舉
  • configurable:布爾值拌阴,默認(rèn)為true
    • 為false時(shí)無法使用delete刪除
    • 為false時(shí)無法成功配置屬性的特性

存取器屬性

存取器屬性和數(shù)據(jù)屬性的區(qū)別就是存取器屬性的值會被一個或兩個方法替代,這個兩個方法是getter和setter奶镶。
存取器屬性的四個特性就是讀(get)迟赃、寫(set)、可枚舉(enumerable)和可配置(configurable)

  • get:一個方法厂镇,用來獲取該屬性的值纤壁,決定了這個存取器是否可讀,當(dāng)get不存在時(shí)捺信,訪問屬性返回的都是undefined
  • set:一個方法酌媒,用來設(shè)置該屬性的值,決定了這個存取器是否可寫,當(dāng)set不存在時(shí)馍佑,屬性的值無法設(shè)置
  • enumerable:布爾值斋否,默認(rèn)為true
    • 為false時(shí)無法被for in 循環(huán)枚舉
  • configurable:布爾值梨水,默認(rèn)為true
    • 為false時(shí)無法使用delete刪除
    • 為false時(shí)無法成功配置屬性的特性拭荤,也就是說此屬性為false的數(shù)據(jù)屬性不能被重新定義為存取器屬性

屬性特性的設(shè)置

上面簡單介紹了數(shù)據(jù)屬性和存取器屬性的一些特性,那么要修改這些特性應(yīng)該怎么做呢疫诽?在ES5中有Object.defineProperty()和Object.defineProperties()兩個方法能直接定義或修改屬性的特性舅世。

  • Object.defineProperty(obj, name, descriptors)
    • obj:將在其上創(chuàng)建或配置屬性的對象
    • name:將創(chuàng)建或配置的屬性的名字
    • descriptors:一個屬性描述符對象,描述要創(chuàng)建的新屬性或?qū)ΜF(xiàn)有屬性的修改
    • 返回值:對象obj
var obj = {}
Object.defineProperty(obj, 'a', {
    configurable: true,
    enumerable: true,
    writable: true,
    value: 123
})

上面這個例子在obj上創(chuàng)建了一個屬性a奇徒,并且配置了四個特性雏亚。但如果obj上本來就有屬性a的話,就只會對
配置的這些特性進(jìn)行覆蓋(前提是a上的configurable這個特性為true)

  • Object.defineProperties(obj, descriptors)
    • obj: 要在其上創(chuàng)建或配置屬性的對象
    • descriptors:將屬性名映射到屬性描述符的對象
    • 返回值:對象obj
var obj = {}
var bbb = 'b'
Object.defineProperties(obj, {
  a: {
    value: 12,
    writable: true,
    enumerable: true,
    configurable: true
  },
  [bbb]: {
    value: 13,
    writable: true,
    enumerable: true,
    configurable: true
  }
})

上面這個例子在obj上創(chuàng)建了屬性a和b摩钙,并且我們知道了可以用變量來替代需要定義的屬性名

通過上面兩個例子我們知道了有兩個方法能給屬性設(shè)置特性罢低,數(shù)據(jù)屬性的四個特性沒什么特別的,我們看看存取器屬性的特性應(yīng)該怎么設(shè)置胖笛。

var obj = {
  a: 1,
  get c() {
    return this.a * 2
  },
  set c(newVal) {
    this.a = newVal / 2
  }
}

這個例子中网持,在obj中創(chuàng)建了一個數(shù)據(jù)屬性a和存取器屬性c,當(dāng)獲取或設(shè)置c的時(shí)候长踊,就會進(jìn)入相應(yīng)的函數(shù)運(yùn)行功舀,注意這里的get和set后面沒有冒號

var obj = {
  a: 12
}
var val = obj.a
Object.defineProperty(obj, 'a', {
  configurable: true,
  enumerable: true,
  get: function() {
    console.log('訪問了屬性a')
    return val
  },
  set: function(newVal) {
    console.log('設(shè)置了屬性a')
    val = newVal
  }
})

這個例子展示了用defineProperty怎么創(chuàng)建存取器屬性,和直接創(chuàng)建的區(qū)別就是這里的get和set后面有冒號身弊,方法中this是指向Object.defineProperty的第一個參數(shù)obj的辟汰,這點(diǎn)和之前的例子一摸一樣。

最后阱佛,還有一個獲取屬性特性的函數(shù)getOwnPropertyDescriptor()

  • Object.getOwnPropertyDescriptor(obj, name)
    • obj:待查詢其屬性特性的對象
    • name:待查詢的屬性名(或數(shù)組元素的索引)
    • 返回值:指定對象指定屬性的一個屬性描述符對象帖汞,如果不存在指定屬性則返回undefined
var obj = {
  a: 12
}
Object.defineProperty(obj, 'a', {
  writable: false
})
console.log(Object.getOwnPropertyDescriptor(obj, 'a')) // {value: 12, writable: false, enumerable: true, configurable: true}
var obj = {
  get a(){
    return 1
  }
}
console.log(Object.getOwnPropertyDescriptor(obj, 'a')) // {get: ?, set: undefined, enumerable: true, configurable: true}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凑术,隨后出現(xiàn)的幾起案子涨冀,更是在濱河造成了極大的恐慌,老刑警劉巖麦萤,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹿鳖,死亡現(xiàn)場離奇詭異,居然都是意外死亡壮莹,警方通過查閱死者的電腦和手機(jī)翅帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來命满,“玉大人涝滴,你說我怎么就攤上這事。” “怎么了歼疮?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵杂抽,是天一觀的道長。 經(jīng)常有香客問我韩脏,道長缩麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任赡矢,我火速辦了婚禮杭朱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吹散。我一直安慰自己弧械,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布空民。 她就那樣靜靜地躺著刃唐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪界轩。 梳的紋絲不亂的頭發(fā)上画饥,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音耸棒,去河邊找鬼荒澡。 笑死,一個胖子當(dāng)著我的面吹牛与殃,可吹牛的內(nèi)容都是我干的单山。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幅疼,長吁一口氣:“原來是場噩夢啊……” “哼米奸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爽篷,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤悴晰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逐工,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铡溪,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年泪喊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棕硫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袒啼,死狀恐怖哈扮,靈堂內(nèi)的尸體忽然破棺而出纬纪,到底是詐尸還是另有隱情,我是刑警寧澤滑肉,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布包各,位于F島的核電站,受9級特大地震影響靶庙,放射性物質(zhì)發(fā)生泄漏问畅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一惶洲、第九天 我趴在偏房一處隱蔽的房頂上張望按声。 院中可真熱鬧膳犹,春花似錦恬吕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豺旬,卻和暖如春钠惩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背族阅。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工篓跛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坦刀。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓愧沟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲤遥。 傳聞我的和親對象是個殘疾皇子沐寺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容