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