摘要:自定義對象是指由開發(fā)者在代碼中所創(chuàng)建的對象。繼承屬性是指在對象原型鏈中的屬性。與此同時,對象的屬性還具有一些特性可寫代表是否可以設(shè)置該對象所對應(yīng)的該屬性的值。我們可以利用來判斷這個對象是否封閉,傳入一個對象,返回布爾值。
這次我們好好聊一聊對象這個東西,本次說的不是array,也不是function,而是object基礎(chǔ)概念
對象是一種特殊的數(shù)據(jù)類型,這種數(shù)據(jù)類型還有其他的很多叫法,比如“散列”,“散列表”,“字典”,“關(guān)聯(lián)數(shù)組”。
對象按照創(chuàng)建者的角度,可以分為三類:
內(nèi)置對象:是由javascript語言本身自定義的對象,大多數(shù)是一些預(yù)定好的構(gòu)造函數(shù)類,比如Array,Date,Function
宿主對象:是指javascript解釋器所嵌入的宿主環(huán)境定義的對象,比如HTMLElement就是宿主對象。
自定義對象:是指由開發(fā)者在代碼中所創(chuàng)建的對象。
我們知道對象的表達方式是:"屬性":"值"
屬性按照來源不同,可以分為兩類:
自有屬性:是指直接在對象中定義的屬性。
繼承屬性:是指在對象原型鏈中的屬性。
與此同時,對象的屬性還具有一些特性:
可寫:代表是否可以設(shè)置該對象所對應(yīng)的該屬性的值。
可枚舉:代表是否可以通過api枚舉出該屬性。
可配置:代表是否可以刪除或修改該屬性。
記住上述概念,有助于我們進行下一步的理解。
創(chuàng)建對象創(chuàng)建對象有三種方式:
第一種:對象直接量
var o = {} var obj = { a: 1, "b": 2, "min title": 3 }
第二種:通過new創(chuàng)建對象
var o = new Object()
第三種:Object.create()
該方法支持傳入兩個參數(shù),第一個參數(shù)是對象的原型(就是所創(chuàng)建出的對象的_proto_的指向),第二個參數(shù)是對屬性進一步的描述(該參數(shù)可選,參數(shù)內(nèi)容會在后面詳解)
以下三種方式是等價的:
檢測對象原型的方法除了instanceof之外,還有一個isPrototypeOf(),我們來看一下使用:
對象的getter和setter我們首先再明確一個概念:
我們常見的{a: 1}中的a叫做數(shù)據(jù)屬性,除此之外還有一個叫做存取器屬性,存取器屬性的值的讀取和設(shè)置,都是由getter和setter控制的。
var o = { p: 0, set q(value) { this.p = value }, get q() { return this.p+=100 } } o.q = 1 console.log(o.q) // => 101 console.log(o.q) // => 201
其中,對象中的函數(shù)定義沒有使用function關(guān)鍵字,使用的而是get和set關(guān)鍵字
處理可以這樣定義存取器屬性,我們還可以利用其他的方法定義存取器屬性,就是我們熟知的Object.defineProperty()和Object.definePeoperties()
首先,我們介紹一下Object.defineProperty()定義數(shù)據(jù)屬性的方式
var o = {} // 定義屬性 Object.defineProperty( o, "x", { value: 1, writable: true, enumerable: true, configurable: true } ) // 修改屬性 Object.defineProperty( o, "x", { value: 2, writable: false } )
這個函數(shù)共有三個參數(shù):
第一個參數(shù)是,需要加屬性的對象。
第二個參數(shù)是,添加的屬性的名稱。
第三個參數(shù)是定義的配置項:
第一個配置就是這個屬性所對應(yīng)的值。
剩余三個配置就是對應(yīng)到文章一開始所提到屬性三個特性可寫,可枚舉,可配置。
這四個配置項都不是必須填寫。假如對于新創(chuàng)建的屬性,value不填,默認(rèn)值就是undefined,其他配置項的缺省值是false。假如對于修改已有的屬性來說,不填寫的配置項就不做修改。
我們再看一下Object.defineProperty()定義存取器屬性的方式
其中,需要注意的是,在定義存取器屬性時無法定義,value和writable配置項,因為定義的get和set從某種意義上代替了前兩個配置項。
var o = {y: 1} Object.defineProperty( o, "x", { set(value) { this.y = value }, get() { return this.y+=100 }, enumerable: true, configurable: true } )
Object.defineProperty只能單個定義或修改對象屬性,Object.defineProperties提供了批量解決的辦法,如下:
var o = {} Object.defineProperties( o, { x: { set(value) { this.y = value }, get() { return this.y+=100 }, enumerable: true, configurable: true }, y: { value: 1, writable: false, enumerable: true, configurable: true } } )
Object.defineProperty和Object.defineProperties對于屬性的修改是有規(guī)則和要求的,如下:
如果對象是不可擴展的,則可以編輯已有的自有屬性,但不能給它添加新屬性。
如果屬性是不可配置的,則不能修改它的可配置性和可枚舉性。
如果存取器屬性是不可配置的,則不能修改其getter和setter方法,也不能將它轉(zhuǎn)換為數(shù)據(jù)屬性。
如果數(shù)據(jù)屬性是不可配置的,則不能將它轉(zhuǎn)換為存取器屬性。
如果數(shù)據(jù)屬性是不可配置的,則不能將它的可寫性從false修改為true,但可以從true修改為false。
如果數(shù)據(jù)屬性是不可配置且不可寫的,則不能修改它的值。然而可配置但不可寫屬性的值是可以修改的(實際上是先將它標(biāo)記為可寫的,然后修改它的值,最后轉(zhuǎn)換為不可寫的)。
在這里,我們再看一下上面的Object.create方法,Object.create的第二個參數(shù)是和Object.defineProperties第二個參數(shù)一樣的,缺省值同樣為undefined和false
沒有提供選項去配置屬性特性的方法,這些屬性默認(rèn)都是true,例如:new關(guān)鍵字和對象直接量的方式創(chuàng)建對象,以及最上面對象直接量的方式設(shè)置getter和setter
對象的擴展性對象的擴展性是什么,其實就是指對象能否添加新的屬性,默認(rèn)情況下所有的內(nèi)置對象和自定義對象都是可擴展的。除非我們?nèi)藶榈母淖兯?/p>
Object.preventExtesions()可以傳入一個參數(shù),就是你要取消擴展功能的對象,操作后,這個對象會不能擴展(即不能添加新屬性),且不能恢復(fù),操作只影響該對象本身,不對其他原型鏈操作產(chǎn)生影響。
我們可以利用Object.esExtensible()判斷這個對象是否可擴展,傳入一個對象,返回布爾值。
Object.seal()可以將對象封閉,效果和上面的Object.preventExtesions()一樣,增加的效果是將這個對象的自有屬性設(shè)置為不可配置(即將configurable設(shè)為false),同樣不能解封。
我們可以利用Object.isSealed()來判斷這個對象是否封閉,傳入一個對象,返回布爾值。
Object.freeze()可以將對象冰凍,效果和上面的Object.seal()一樣,增加的效果是將這個對象的自有屬性設(shè)置為不可寫(即將writable設(shè)為false),同樣不能解凍。
Object.isFrozen()可以判斷這個對象是否冰凍。
根據(jù)屬性查詢值的方式我們當(dāng)然是眾所周知了,[]和.,當(dāng)然他們也可以設(shè)置和修改可寫性為true的自有屬性值
var o = {} Object.defineProperties( o, { x: { value: 1, writable: true, enumerable: true, configurable: true }, y: { value: 1, writable: false, enumerable: true, configurable: true } } ) o.x // => 1 o["x"] = 5 o.x // => 5 o.y = 5 o.y // => 1刪除屬性
delete可以用戶刪除對象屬性,能刪除的屬性只是該對象的自有屬性且屬性配置性為true的屬性
讓人感到意外的是,delete只是斷開屬性和宿主對象的聯(lián)系,而不會去操作屬性中的屬性。
檢測屬性是否存在檢測屬性共有三種方式,in操作符,hasOwnProperty和propertyIsEnumerable
in可以檢測對象的自有屬性和繼承屬性,不受屬性特性的影響
var o = {x: 1} "x" in o // true "y" in o // false "toString" in o // true
hasOwnProperty只能檢測對象的自有屬性,不能檢測繼承屬性,不受屬性特性的影響
var o = {x: 1} o.hasOwnProperty("x") // true o.hasOwnProperty("y") // false o.hasOwnProperty("toString") // false
propertyIsEnumerable只能檢測自有屬性,且要求這個屬性的可枚舉性為true
枚舉全部屬性首先第一個方法是for/in,這個方法可以枚舉出當(dāng)前對象可枚舉(屬性枚舉性為true)的自有屬性和繼承屬性
var o = Object.create({z: 1}) Object.defineProperties( o, { x: { value: 1, writable: true, enumerable: true, configurable: true }, y: { value: 1, writable: false, enumerable: false, configurable: true } } ) for (p in o) {console.log(p)} // => x, z
第二個方法是Object.keys(),這個方法可以枚舉出當(dāng)前對象的可枚舉(屬性枚舉性為true)的自有屬性,返回值是一個數(shù)組
var o = Object.create({z: 1}) Object.defineProperties( o, { x: { value: 1, writable: true, enumerable: true, configurable: true }, y: { value: 1, writable: false, enumerable: false, configurable: true } } ) Object.keys(o) // => ["x"]
第三個方法是Object.getOwnPropertyNames,它可以枚舉出當(dāng)前對象所有的自有屬性(不受枚舉性影響)
Object.defineProperties( o, { x: { value: 1, writable: true, enumerable: true, configurable: true }, y: { value: 1, writable: false, enumerable: false, configurable: true } } ) Object.getOwnPropertyNames(o) // => ["x", "y"]對象的序列化和反序列化
JSON.stringify()和JSON.parse()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93039.html
摘要:案例每隔毫秒調(diào)用函數(shù)并顯示時間。當(dāng)點擊按鈕時,停止時間代碼如下計時器每隔毫秒調(diào)用函數(shù),并將返回值賦值給計時器計時器,在載入后延遲指定時間后去執(zhí)行一次表達式僅執(zhí)行一次。該值標(biāo)識要取消的延遲執(zhí)行代碼塊。 簡述 本系列將持續(xù)更新Javascript基礎(chǔ)部分的知識,誰都想掌握高端大氣的技術(shù),但是我覺得沒有一個扎實的基礎(chǔ),我認(rèn)為一切高階技術(shù)對我來講都是過眼云煙,要成為一名及格的前端工程師,必須把...
摘要:構(gòu)造函數(shù)通常首字母大寫,用于區(qū)分普通函數(shù)。這種關(guān)系常被稱為原型鏈,它解釋了為何一個對象會擁有定義在其他對象中的屬性和方法。中所有的對象,都有一個屬性,指向?qū)嵗龑ο蟮臉?gòu)造函數(shù)原型由于是個非標(biāo)準(zhǔn)屬性,因此只有和兩個瀏覽器支持,標(biāo)準(zhǔn)方法是。 從這篇文章開始,復(fù)習(xí) MDN 中級教程 的內(nèi)容了,在初級教程中,我和大家分享了一些比較簡單基礎(chǔ)的知識點,并放在我的 【Cute-JavaScript】系...
摘要:以和為例,說明中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進制數(shù)據(jù)。對象用來表示通用的固定長度的原始二進制數(shù)據(jù)緩沖區(qū)。中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進制數(shù)據(jù)對和有了一個大概的了解,下面讓我們來看下它是如何進行二進制數(shù)據(jù)操作的。 概述 本文主要通過對JavaScript中數(shù)字?jǐn)?shù)據(jù)與二進制數(shù)據(jù)之間的轉(zhuǎn)換,讓讀者能夠了解在JavaScript中如何對數(shù)字類型(包括但不限于Number類型)進行處理。 二進制數(shù)據(jù)在日常...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個最重要的技術(shù)點常用整理網(wǎng)頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實現(xiàn)的大排序算法一怪對象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術(shù)點 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...
閱讀 3242·2021-10-21 17:50
閱讀 3254·2021-10-08 10:05
閱讀 3380·2021-09-22 15:04
閱讀 581·2019-08-30 14:00
閱讀 1939·2019-08-29 17:01
閱讀 1508·2019-08-29 15:16
閱讀 3219·2019-08-26 13:25
閱讀 852·2019-08-26 11:44