国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【基礎(chǔ)系列】javascript中的對象

617035918 / 1839人閱讀

摘要:自定義對象是指由開發(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ù)類,比如ArrayDateFunction
宿主對象:是指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)鍵字,使用的而是getset關(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()定義存取器屬性的方式
其中,需要注意的是,在定義存取器屬性時無法定義,valuewritable配置項,因為定義的getset從某種意義上代替了前兩個配置項。

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.definePropertyObject.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ù)一樣的,缺省值同樣為undefinedfalse

沒有提供選項去配置屬性特性的方法,這些屬性默認(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ù)屬性查詢值

根據(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操作符,hasOwnPropertypropertyIsEnumerable

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

相關(guān)文章

  • Javascript學(xué)習(xí)總結(jié) - JS基礎(chǔ)系列

    摘要:案例每隔毫秒調(diào)用函數(shù)并顯示時間。當(dāng)點擊按鈕時,停止時間代碼如下計時器每隔毫秒調(diào)用函數(shù),并將返回值賦值給計時器計時器,在載入后延遲指定時間后去執(zhí)行一次表達式僅執(zhí)行一次。該值標(biāo)識要取消的延遲執(zhí)行代碼塊。 簡述 本系列將持續(xù)更新Javascript基礎(chǔ)部分的知識,誰都想掌握高端大氣的技術(shù),但是我覺得沒有一個扎實的基礎(chǔ),我認(rèn)為一切高階技術(shù)對我來講都是過眼云煙,要成為一名及格的前端工程師,必須把...

    zlyBear 評論0 收藏0
  • 【重溫基礎(chǔ)】15.JS對象介紹

    摘要:構(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】系...

    booster 評論0 收藏0
  • WebSocket系列JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進制數(shù)據(jù)

    摘要:以和為例,說明中的數(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ù)在日常...

    MASAILA 評論0 收藏0
  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函數(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)生改變的方式。因此,...

    cfanr 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優(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 ...

    jsbintask 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<