摘要:不可與同時(shí)使用,會(huì)由屬性的寫入觸發(fā)。權(quán)限僅可對(duì)為的屬性進(jìn)行賦值。作用完全鎖死,不能做任何修改。需要注意的是,上述三個(gè)都是對(duì)原有對(duì)象的操作,并不會(huì)返回一個(gè)新的對(duì)象。可以說這些屬性描述符是針對(duì)對(duì)象的屬性做出的限制或者保護(hù)。
前言
昨天談到了這些問題,發(fā)現(xiàn)認(rèn)識(shí)比較片面。決定仔細(xì)看看并總結(jié)一下。
研究Object的部分ES5 API。可能會(huì)提到部分ES6內(nèi)容。
Object MDN API
屬性描述符即描述對(duì)象屬性特性的描述符
四個(gè)特性描述符value 值
writable 只讀性
enumerable 可枚舉性
configurable 可配置性(屬性的刪除與重新配置)
value默認(rèn)為undefined
在使用Object.create()和Object.defineProperty時(shí)writable、enumerable、configurable默認(rèn)均為false
get 不可與value同時(shí)使用,會(huì)由屬性的讀取觸發(fā)。
set 不可與writable同時(shí)使用,會(huì)由屬性的寫入觸發(fā)。
將會(huì)在其他的api中介紹屬性描述符的用法
對(duì)象的創(chuàng)建與屬性修改 Object.create()Object.create(proto, [ propertiesObject ])
此api的作用是以proto為原型,以propertiesObject中自有屬性(不包含propertiesObject的原型上的屬性,包含所有不可枚舉屬性)為屬性創(chuàng)建一個(gè)新的對(duì)象。
// 非嚴(yán)格模式下運(yùn)行,嚴(yán)格模式下會(huì)拋出異常 const proto = { saySize () { console.log(this.size) } } const propertiesObject = { size: { enumerable: false, configurable: false, value: "large" }, color: { writable: true, enumerable: true, configurable: true, value: "red" } } let newObj = Object.create(proto, propertiesObject) // 原型 newObj.saySize() // "large" // writable newObj.size = "small" newObj.color = "green" console.log(newObj.size, newObj.color) // "large,green" // enumerbale for(key in newObj){ console.log(key) } // "color" // "saySize" delete newObj.size // false delete newObj.color // true
上述代碼中的proto使用Fun.prototype即可實(shí)現(xiàn)原型鏈的繼承。
那么要怎樣才能枚舉出enumerable:false的屬性呢?
Object.defineProperty()Object.defineProperty(obj, prop, descriptor)
此api允許修改或向obj添加屬性
obj為目標(biāo)對(duì)象,prop為要修改或添加的屬性,descriptor為屬性描述符
let tempObj1 = {} Object.defineProperty(tempObj, "name", { value: "temp", writable: false, enumerable: true, configurable: false }) console.log(tempObj) // Object {name: "temp"} // 拋出異常 Object.defineProperty(tempObj, "name", { value: temp, writable: true })
對(duì)于configurable: false的屬性禁止修改屬性描述符,會(huì)拋出異常。
let tempObj2 = {_name: "temp2"} Object.defineProperty(tempObj2, "name", { get () { return `名字為${this._name}` }, set (value) { console.log(`新名字為${value}`) } }) console.log(tempObj2.name) // "名字為temp2" tempObj2.name = "temp2.0" // "新名字為temp2.0"
可以觀察到 讀屬性值與 寫屬性值分別觸發(fā)了get和set屬性訪問器。
代碼中所用到的"`名字為${this._name}`" 為es6模板字符串,實(shí)現(xiàn)拼串
Object.defineProperties(obj, props)
此api方便了屬性的批量修改,第二個(gè)參數(shù)與Object.create()的第二個(gè)參數(shù)結(jié)構(gòu)相同。
let tempObj3 = {name:"temp"} Object.defineProperties(tempObj3, { name: { value: "newTemp", writable: true }, color: { value: "red", writable: true, enumerable: true } }) console.log(tempObj3) // Object {name: "newTemp", color: "red"}對(duì)象屬性的檢測(cè)與檢索
我們也看到了對(duì)于enumerable:false的屬性是不可枚舉的。甚至ES6中還有“隱蔽性”更高的Symbol()可以作為屬性鍵。那么怎么才能正確的檢測(cè)與獲取對(duì)象的屬性呢?
我們先創(chuàng)建一個(gè)對(duì)象用于實(shí)驗(yàn)后續(xù)的所有方法。
原型和自身都各包含三種屬性:enumerable: false,enumerable: true,Symbol()
const proto = Object.create(null, { supTrue: { value: "value1", enumerable: true }, supFalse: { value: "value2", enumerable: false } }) proto[Symbol("supSymbol")] = "supSymbol" console.log(proto) // { // supTrue: "value", // Symbol(supSymbol): "supSymbol", // supFalse: "value2" // } let obj = Object.create(proto, { ownTrue: { value: "value1", enumerable: true }, ownFalse: { value: "value2", enumerable: false } }) obj[Symbol("ownSymbol")] = "ownSymbol" // ok,obj可用for-in
for (const key in obj) { console.log(key) } // subTrue, ownTrue
可以看到for in枚舉了包括原型鏈在內(nèi)的所有可枚舉屬性
Object.keys()Object.keys(obj) // ["ownTrue"]
可以看到返回了一個(gè)只包含自身可枚舉屬性鍵的數(shù)組。
Object.getOwnPropertyNames()Object.getOwnPropertyNames(obj) // ["ownTrue", "ownFalse"]
可以看到返回了一個(gè)包含自身所有非symbol的屬性鍵的數(shù)組。
由此也可以看到symbol類型的屬性的“隱蔽性”
針對(duì) 獲取symbol可使用此方法。
Reflect.ownKeys()雖然這個(gè)不是Object的方法
但是可以用來獲取自身所有屬性鍵
Reflect.ownKeys(obj) // ["ownTrue", "ownFalse", Symbol(ownSymbol)]把對(duì)象關(guān)起來
按照權(quán)限從大到小排列
Object.preventExtensions()作用:將對(duì)象變的不可擴(kuò)展,不可添加新的屬性。
Object.seal()作用:將對(duì)象“密封”,不可添加新屬性,屬性的configurable置為false,writable為true的屬性仍然可以被重新賦值。
權(quán)限:僅可對(duì)writable為true的屬性進(jìn)行賦值。
作用:完全“鎖死”,不能做任何修改。
權(quán)限:0。
需要注意的是,上述三個(gè)api都是對(duì)原有對(duì)象的操作,并不會(huì)返回一個(gè)新的對(duì)象。
let obj = {} Object.preventExtensions(obj) === obj // true Object.seal(obj) === obj // true Object.freeze(obj) === obj // true
可以說writable,configurable這些屬性描述符是針對(duì)對(duì)象的屬性做出的限制或者保護(hù)。
那么Object.seal(),Object.preventExtensions(),Object.freeze()就是對(duì)對(duì)象本身做出限制或者保護(hù)。
同時(shí)我們也知道在ES6中使用const可以聲明一個(gè)"常量",但是要注意的是const確保的只是指針的不可更改。比如:
const obj = {key: "value1"} obj.key = "value2" // 可完成 obj = {key2: "value2"} // 更改指針,拋出異常
針對(duì)對(duì)象,此時(shí)就可以使用上述三個(gè)把對(duì)象關(guān)起來的api。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/83638.html
摘要:概述本章是使用機(jī)器學(xué)習(xí)預(yù)測(cè)天氣系列教程的第一部分,使用和機(jī)器學(xué)習(xí)來構(gòu)建模型,根據(jù)從收集的數(shù)據(jù)來預(yù)測(cè)天氣溫度。數(shù)據(jù)類型是機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)常會(huì)用到的數(shù)據(jù)結(jié)構(gòu)。 概述 ??本章是使用機(jī)器學(xué)習(xí)預(yù)測(cè)天氣系列教程的第一部分,使用Python和機(jī)器學(xué)習(xí)來構(gòu)建模型,根據(jù)從Weather Underground收集的數(shù)據(jù)來預(yù)測(cè)天氣溫度。該教程將由三個(gè)不同的部分組成,涵蓋的主題是: 數(shù)據(jù)收集和處理(本文)...
摘要:創(chuàng)建對(duì)象的兩種方式推薦該構(gòu)造器可以接受任何類型的參數(shù),并且會(huì)自動(dòng)識(shí)別參數(shù)的類型,并選擇更合適的構(gòu)造器來完成相關(guān)操作。比如二的成員該屬性指向用來構(gòu)造該函數(shù)對(duì)象的構(gòu)造器,在這里為該方法返回的是一個(gè)用于描述目標(biāo)對(duì)象的字符串。 之前看到【深度長(zhǎng)文】JavaScript數(shù)組所有API全解密和JavaScript字符串所有API全解密這兩篇高質(zhì)量的文章。發(fā)現(xiàn)沒寫對(duì)象API解析(估計(jì)是博主覺得簡(jiǎn)單,...
摘要:是一款可以對(duì)產(chǎn)品圖片進(jìn)行度全方位旋轉(zhuǎn)展示的插件。動(dòng)畫幀通過切換的速度,默認(rèn)值為毫秒。動(dòng)畫幀改編之后的回調(diào)函數(shù)以當(dāng)前幀和總幀數(shù)為參數(shù)。返回對(duì)象的總的動(dòng)畫幀數(shù)。顯示對(duì)象的元素節(jié)點(diǎn)。 Circlr是一款可以對(duì)產(chǎn)品圖片進(jìn)行360度全方位旋轉(zhuǎn)展示的插件。Circlr通過按一定角度規(guī)律拍攝的產(chǎn)品圖片,制作出可以使用鼠標(biāo)拖動(dòng)、鼠標(biāo)滾輪和移動(dòng)觸摸來進(jìn)行圖片逐幀旋轉(zhuǎn)的效果。比先前的Rollerblade...
閱讀 1202·2021-11-23 09:51
閱讀 1980·2021-10-08 10:05
閱讀 2339·2019-08-30 15:56
閱讀 1900·2019-08-30 15:55
閱讀 2640·2019-08-30 15:55
閱讀 2487·2019-08-30 13:53
閱讀 3498·2019-08-30 12:52
閱讀 1250·2019-08-29 10:57