成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

重溫JS基礎(chǔ)--JS中的對(duì)象屬性

jerryloveemily / 2246人閱讀

摘要:數(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)建的。

一. 理解對(duì)象

之前說(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)
    }
}
1. 屬性類(lèi)型

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è)是gettersetter函數(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
    }
})
2. 定義多個(gè)屬性

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。

3. 讀取屬性的特性

在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"
總結(jié)一波

關(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

相關(guān)文章

  • 重溫基礎(chǔ)】15.JS對(duì)象介紹

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

    booster 評(píng)論0 收藏0
  • 重溫基礎(chǔ)】22.內(nèi)存管理

    摘要:內(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...

    Pandaaa 評(píng)論0 收藏0
  • 重溫基礎(chǔ)】16.JSON對(duì)象介紹

    摘要:系列目錄復(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...

    0x584a 評(píng)論0 收藏0
  • 重溫基礎(chǔ)】14.元編程

    摘要:本文是重溫基礎(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è)...

    cc17 評(píng)論0 收藏0
  • 重溫基礎(chǔ)】6.數(shù)字

    摘要:本文是重溫基礎(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)和...

    terro 評(píng)論0 收藏0
  • 重溫基礎(chǔ)】9.正則表達(dá)式

    摘要:前置知識(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ǔ)...

    ispring 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<