摘要:數(shù)據(jù)屬性有個(gè)描述其行為的特性表示能否通過(guò)刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性。總結(jié)一波關(guān)于這些內(nèi)容主要講的就是在的對(duì)象屬性可以分為兩類(lèi),一類(lèi)就是數(shù)據(jù)屬性,一類(lèi)就是訪問(wèn)器屬性。
面向?qū)ο蟮恼Z(yǔ)言都有一個(gè)類(lèi)的概念,通過(guò)類(lèi)可以創(chuàng)建任意多個(gè)具有相同屬性和方法的對(duì)象。
JavaScript中把對(duì)象定義為無(wú)序?qū)傩缘募?/strong>,屬性可以包含基本值,對(duì)象或者函數(shù)。也可以將對(duì)象理解為一組沒(méi)有特定順序的值。
每個(gè)對(duì)象都是基于一個(gè)引用類(lèi)型創(chuàng)建的。
之前說(shuō)過(guò)創(chuàng)建對(duì)象的最簡(jiǎn)單的方式就是創(chuàng)建一個(gè)Object實(shí)例,然后為它添加屬性和方法:
var person = new Object() person.name = "Nicholas" person.age = "29" person.sayName = function () { alert(this.name) }
如上,創(chuàng)建了一個(gè)名為person的對(duì)象,然后為它添加了兩個(gè)屬性和一個(gè)方法。
還有一種是就是通過(guò)對(duì)象字面量的方式創(chuàng)建對(duì)象,如下:
var person = { name: "Nicholas", age: 29, sayName: function(){ alert(this.name) } }
JavaScript第五版在定義屬性內(nèi)部才用的特性,描述了屬性的各種特征。定義這些特性是為了給JavaScript引擎用的,因此在JavaScript中不能直接訪問(wèn)它們。為了表示特性是內(nèi)部值,該規(guī)范把它們放在了兩對(duì)兒方括號(hào)中,例如:[[Enumerable]]。
JavaScript中有兩種屬性:數(shù)據(jù)屬性和訪問(wèn)器屬性。
數(shù)據(jù)屬性
數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置,在這個(gè)位置可以讀取和寫(xiě)入值。數(shù)據(jù)屬性有4個(gè)描述其行為的特性:
(1)[[Configurable]]: 表示能否通過(guò)delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性。對(duì)于直接定義在對(duì)象上的數(shù)據(jù)屬性,該特性為true。 (2 [[Enumerable]]: 表示能否通過(guò)for-in循環(huán)遍歷到屬性。 (3)[[Writable]]: 表示能否修改屬性的值。 (4)[[Value]]: 包含整個(gè)屬性的數(shù)據(jù)值,讀取屬性的時(shí)候,從這個(gè)位置進(jìn)行讀取,寫(xiě)入屬性值得時(shí)候,保存到該位置。
對(duì)于直接在對(duì)象上添加的屬性,他們的[[Configurable]]、[[Enumerable]]、[[Writable]]特性都被設(shè)置為true。如:
var person = { name: "Nicholas" }
如上,我們通過(guò)對(duì)象字面量的方法創(chuàng)建一個(gè)對(duì)象,創(chuàng)建一個(gè)name屬性,為它指定的值為"Nicholas", 那么此時(shí)[[Value]]特性將被設(shè)置為"Nicholas",而對(duì)這個(gè)值得任何修改都將反應(yīng)在這個(gè)位置上。其他的三個(gè)特性都默認(rèn)為true。
要修改屬性默認(rèn)的特性可以使用Object.defineProperty()方法。這個(gè)方法接受三個(gè)參數(shù):屬性所在對(duì)象,屬性的名字,一個(gè)描述符對(duì)象。其中描述符對(duì)象的屬性必須是:configurable, enumerable, writable, value,設(shè)置其中一個(gè)或多個(gè)值,可以修改對(duì)應(yīng)的特性。如下:
var person = {} Object.defineProperty(person, "name", { wirtable: false, value: "Nicholas" }) console.log(person.name) //"Nicholas" person.name = "greg" console.log(person.name) //"Nicholas"
如上,創(chuàng)建一個(gè)名為name的屬性,將他的值設(shè)置為"Nicholas", 然后設(shè)置為只讀,這個(gè)屬性的值是不可修改的。類(lèi)似的規(guī)則也適用于不可配置的屬性:
var person = {} Object.defineProperty(person, "name", { configurable: false, value: "Nicholas" }) console.log(person.name) //"Nicholas" delete person.name console.log(person.name) //"Nicholas"
如上,把configurable設(shè)置為false,表示不能從對(duì)象中刪除屬性,所以看到刪除name屬性并沒(méi)有起作用。而且,如果把屬性定義為不可配置的,就不能把它變回可配置的了,此時(shí)再調(diào)用Object.defineProperty()方法除了只能修改writable,其他都會(huì)導(dǎo)致錯(cuò)誤。
var person = {} Object.defineProperty(person, "name", { configurable: false, value: "Nicholas" }) Object.defineProperty(person, "name", { configurable: true, value: "Nicholas" }) //報(bào)錯(cuò):Cannot redefine property: name...
如上就會(huì)報(bào)錯(cuò), 也就是多次調(diào)用Object.defineProperty()方法修改同一屬性,但是把configurable特性設(shè)置為false之后就會(huì)有限制。
通過(guò)Object.defineProperty()創(chuàng)建一個(gè)新屬性的時(shí)候,如果不指定configurable,enumberable 和writable特性的默認(rèn)值都是false。
訪問(wèn)器屬性
訪問(wèn)器屬性是不包含數(shù)據(jù)值的。它只包含兩個(gè)函數(shù),一個(gè)是getter和setter函數(shù),不過(guò)這兩個(gè)函數(shù)都不是必須的。在讀取訪問(wèn)器屬性的時(shí)候,會(huì)調(diào)用getter函數(shù),這個(gè)函數(shù)返回該屬性有效的值。在寫(xiě)入訪問(wèn)器屬性的時(shí)候,會(huì)調(diào)用setter函數(shù)并傳入新值,這個(gè)函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。訪問(wèn)器屬性也具有4個(gè)特性:
(1)[[Configurable]]: 表示能否通過(guò)delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數(shù)據(jù)屬性,對(duì)于直接在對(duì)象上定義的屬性,這個(gè)特性的默認(rèn)值為true。 (2)[[Enumberable]]: 表示能否通過(guò)for-in循環(huán)返回屬性。對(duì)于直接在對(duì)象上定義的屬性,該特性默認(rèn)為true。 (3)[[Get]]: 在讀取屬性時(shí)調(diào)用的函數(shù),默認(rèn)為undefined (4)[[Set]]: 在寫(xiě)入屬性時(shí)調(diào)用的函數(shù),默認(rèn)值為undefined
訪問(wèn)器屬性不能直接定義,必須使用Object.defineProperty()來(lái)定義。如下例子:
var book = { _year: 2004, editor: 1 } Object.defineProperty(book, "year", { //定義了一個(gè)訪問(wèn)器屬性year get: function() { return this._year }, set: function(newVal) { if(newVal > 2004) { this._year = newVal this.editor = this.editor + newVal - 2004 } } }) book.year = 2005 console.log(book.year) //2005 console.log(book.editor) //2
如上,我們創(chuàng)建一個(gè)book對(duì)象,并且定義了兩個(gè)默認(rèn)的屬性_year和editor。訪問(wèn)器屬性則包含一個(gè)getter函數(shù)和一個(gè)setter函數(shù)。getter函數(shù)返回_year的值,而setter函數(shù)通過(guò)計(jì)算來(lái)確定正確的版本。使用訪問(wèn)器屬性的常見(jiàn)方式,即設(shè)置一個(gè)屬性的值會(huì)導(dǎo)致其他屬性發(fā)生變化。
不一定要同時(shí)制定getter和setter。只指定getter以為著是不能寫(xiě),嘗試寫(xiě)入會(huì)忽略,在嚴(yán)格模式下會(huì)報(bào)錯(cuò)。同理,只設(shè)置setter函數(shù)的訪問(wèn)器屬性不能讀。
在此之前要?jiǎng)?chuàng)建訪問(wèn)器屬性有兩個(gè)非標(biāo)準(zhǔn)的方法,再這里稍微提一下:__defineGetter__和__defineSetter__。
var book = { _year: 2004, editor: 1 } book.__defineGetter__("year", function(){ return this.year }) book.__defineSetter__("year", function(newval) { if(newval > 2005) { this._year = newval this.editor += newval - 2004 } })
ECMAScript5 定義了一個(gè)Object.defineProperties()方法,利用這個(gè)方法可以通過(guò)描述符一次定義多個(gè)屬性。這個(gè)方法接受兩個(gè)參數(shù):第一個(gè)對(duì)象是要添加和修改其屬性的對(duì)象,第二個(gè)對(duì)象的屬性與第一個(gè)對(duì)象中要添加和修改的屬性一一對(duì)應(yīng)。如下例子:
var book = {} Object.defineProperties(book, { _year: { writable: true, value: 2004 }, editor: { writable: true, value: 1 }, year: { get: function() { return this._year }, set: function(newval) { if(newval > 2005) { this._year = 2005 this.editor += newval - 2004 } } } })
如上,定義兩個(gè)兩個(gè)數(shù)據(jù)屬性_year和editor,和一個(gè)訪問(wèn)器屬性year。
在ECMAScript5 中定義了一個(gè)Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符,這個(gè)方法接受兩個(gè)參數(shù): 屬性所在對(duì)象和要讀取其描述符的屬性名稱(chēng)。其返回值是一個(gè)對(duì)象,如果是訪問(wèn)器屬性,這個(gè)對(duì)象有confiurable, enumerable, get, set。如果是數(shù)據(jù)屬性那么就是configurable, enumberable, writeable, value。
var book = {} Object.defineProperties(book, { _year: { writable: true, value: 2004 }, editor: { writable: true, value: 1 }, year: { get: function() { return this._year }, set: function(newval) { if(newval > 2005) { this._year = 2005 this.editor += newval - 2004 } } } }) var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); console.log(descriptor.value) //2004 console.log(descriptor.configurable) //false console.log(typeof descriptor.get) //"undefined" var des = Object.getOwnPropertyDescriptor(book, "year") console.log(des.value) //"undefined" console.log(des.enumberable) //false console.log(typeof descriptor.get) //"function"
關(guān)于這些內(nèi)容主要講的就是:
在JavaScript的對(duì)象屬性可以分為兩類(lèi),一類(lèi)就是數(shù)據(jù)屬性,一類(lèi)就是訪問(wèn)器屬性。
數(shù)據(jù)屬性有configurable, enumberable, wirtable, value四個(gè)特性。
訪問(wèn)器屬性有configurable, enumberable, get, set四個(gè)特性。
訪問(wèn)器屬性只能通過(guò)Object.defineProperty()方法進(jìn)行設(shè)置。
還有Object.defineProperties()方法和Object.getOwnPropertyDescriptor()方法的作用。
...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88791.html
摘要:構(gòu)造函數(shù)通常首字母大寫(xiě),用于區(qū)分普通函數(shù)。這種關(guān)系常被稱(chēng)為原型鏈,它解釋了為何一個(gè)對(duì)象會(huì)擁有定義在其他對(duì)象中的屬性和方法。中所有的對(duì)象,都有一個(gè)屬性,指向?qū)嵗龑?duì)象的構(gòu)造函數(shù)原型由于是個(gè)非標(biāo)準(zhǔn)屬性,因此只有和兩個(gè)瀏覽器支持,標(biāo)準(zhǔn)方法是。 從這篇文章開(kāi)始,復(fù)習(xí) MDN 中級(jí)教程 的內(nèi)容了,在初級(jí)教程中,我和大家分享了一些比較簡(jiǎn)單基礎(chǔ)的知識(shí)點(diǎn),并放在我的 【Cute-JavaScript】系...
摘要:內(nèi)存泄露內(nèi)存泄露概念在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準(zhǔn)。 本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對(duì)象介紹 【重溫基礎(chǔ)】16.JSON對(duì)象介紹 【重溫基礎(chǔ)】1...
摘要:系列目錄復(fù)習(xí)資料資料整理個(gè)人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對(duì)象介紹本章節(jié)復(fù)習(xí)的是中的關(guān)于對(duì)象相關(guān)知識(shí)。概念概念有三點(diǎn)全稱(chēng)對(duì)象表示法。對(duì)象沒(méi)有分號(hào),而對(duì)象有。序列化對(duì)象時(shí),所有函數(shù)及原型成員都會(huì)被忽略,不體現(xiàn)在結(jié)果上。 本文是 重溫基礎(chǔ) 系列文章的第十六篇。今日感受:靜。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15...
摘要:本文是重溫基礎(chǔ)系列文章的第十四篇。元,是指程序本身。有理解不到位,還請(qǐng)指點(diǎn),具體詳細(xì)的介紹,可以查看維基百科元編程。攔截,返回一個(gè)布爾值。 本文是 重溫基礎(chǔ) 系列文章的第十四篇。 這是第一個(gè)基礎(chǔ)系列的最后一篇,后面會(huì)開(kāi)始復(fù)習(xí)一些中級(jí)的知識(shí)了,歡迎持續(xù)關(guān)注呀! 接下來(lái)會(huì)統(tǒng)一整理到我的【Cute-JavaScript】的JavaScript基礎(chǔ)系列中。 今日感受:獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè)...
摘要:本文是重溫基礎(chǔ)系列文章的第六篇。以指定的精度返回該數(shù)值對(duì)象的字符串表示,可接收一個(gè)參數(shù),用來(lái)指定有效數(shù)個(gè)數(shù)的整數(shù)。 本文是 重溫基礎(chǔ) 系列文章的第六篇。今日感受:自己需要多總結(jié),會(huì)有不同收獲(比如今晚我做的轉(zhuǎn)正總結(jié))。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類(lèi)型 【重溫基礎(chǔ)】2.流程控制和錯(cuò)誤處理 【重溫基礎(chǔ)】3.循環(huán)和...
摘要:前置知識(shí)中的正則表達(dá)式是用來(lái)匹配字符串中指定字符組合的模式。另外需要記住正則表達(dá)式也是對(duì)象。在正則表達(dá)式創(chuàng)建時(shí)更新,不執(zhí)行。替換與正則表達(dá)式匹配的子串。查找以十六進(jìn)制數(shù)規(guī)定的字符。正則表達(dá)式拓展介紹在中有兩種情況。 本文是 重溫基礎(chǔ) 系列文章的第九篇。 今日感受:時(shí)間管理-角色管理法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)...
閱讀 2481·2021-09-29 09:34
閱讀 3320·2021-09-23 11:21
閱讀 2513·2021-09-06 15:00
閱讀 1138·2019-08-30 15:44
閱讀 2040·2019-08-29 17:23
閱讀 3011·2019-08-29 16:44
閱讀 3068·2019-08-29 13:13
閱讀 1948·2019-08-28 18:12