面向對象(理解對象)——JavaScript基礎總結(一)

定義

無序屬性的集合(散列表),其屬性能夠包含基本值,對象或函數;瀏覽器

每一個對象都是基於一個引用類型建立的,這個引用類型能夠是原生類型,也能夠是自定義類型。函數

建立對象

建立一個Object實例ui

var person = new Object()
    
    person.name = 'Memory'
    person.age = 24
                
    person.sayName = function () {
        console.log(this.name)  // Memory
    }
複製代碼

對象字面量this

var person = {
        name: 'Memory',
        age: 24,
    
        sayName: function () {
            console.log(this.name)  // Memory
        }
    }
複製代碼

其中nameage是person的屬性,sayName是person的方法。spa

屬性類型

只有內部才用的特性,在JS中不能直接訪問它們,爲了表示特性是內部值,把它們放到了[[]]中;設計

ECMAScript中有如下兩種屬性,數據屬性和訪問器屬性。code

屬性類型

數據屬性

其中,person.name的[Configurable]]、[[Enumerable]]、[[Writable]]都爲true,[[Value]]爲Memory。cdn

修改數據屬性:Object.defineProperty(對象obj, [屬性名稱], 描述符對象)對象

其中,描述符對象的屬性必須是configurable、enumerable、writable、value以內的一到四個。blog

在調用Object.defineProperty時,若是不指定,configurable、enumerable、writable的值都默認爲false

在把configurable設爲false以前,能夠屢次調用Object.defineProperty()修改同一個屬性。以後修改除writable以外的其餘特性,都會致使錯誤;

嘗試修改writable:

Object.defineProperty(person, 'name', {
        configurable: false,
    })
    
    console.log(person.name)   // Memory
    
    Object.defineProperty(person, 'name', {
        writable: true,
        value: 'doublemeng'
    })
    
    console.log(person.name)   // doublemeng
複製代碼

嘗試修改configurable:

Object.defineProperty(person, 'name', {
        configurable: false,
    })
    
    console.log(person.name)   // Memory
    
    // Uncaught TypeError: Cannot redefine property: name
    Object.defineProperty(person, 'name', {
        configurable: true,
        value: 'doublemeng'
    })
    
    console.log(person.name)   
複製代碼

configurable設爲false,即表示不能從對象中刪除屬性;

若是這個對象調用delete,非嚴格模式下會被忽略,嚴格模式下則會拋錯。

writable設爲false,即表示該屬性不可寫;

非嚴格模式下會被忽略,嚴格模式下則會拋錯。

訪問器屬性

訪問器屬性包含getter和setter函數(這兩個函數都不是必需的),其中setter用來寫值,getter用來讀值。

設置一個屬性的值會致使其餘屬性的變化,以下例year的變化致使_yearage的變化:

var book = {
        age: 1,
        _year: 2000   // 只能經過對象方法訪問的屬性
    }
    
    console.log(book._year)   // 2000
    console.log(book.age)   // 1
    
    Object.defineProperty(book, 'year', {
        get: function () {
            return this._year
        },
        set: function (newYear) {
            this._year = newYear
            this.age = newYear - 2000 + 1
        }
    })
    
    book.year = 2019
    
    console.log(book._year)   // 2019
    console.log(book.age)   // 20
複製代碼

不必定非要指定getter和setter;

只指定getter意味着屬性只能讀不能寫;

嘗試寫入,在非嚴格模式下會被忽略,嚴格模式下則會拋錯。

只指定setter意味着屬性只能讀不能讀;

嘗試讀取,在非嚴格模式下會返回undefined,嚴格模式下則會拋錯。

在該方法以前,要建立訪問器屬性通常要使用兩個非標準的方法:__defineGetter__()__defineSetter__()

var book = {
        age: 1,
        _year: 2000   // 只能經過對象方法訪問的屬性
    }
    
    console.log(book._year)   // 2000
    console.log(book.age)   // 1
    
    book.__defineGetter__('year', function () {
        return this._year
    })
    
    book.__defineSetter__('year', function (newYear) {
        this._year = newYear
        this.age = newYear - 2000 + 1
    })
    
    book.year = 2019  
    
    console.log(book._year)   // 2019
    console.log(book.age)   // 20
複製代碼

不支持Object.defineProperty()的瀏覽器不能修改[Configurable]][[Enumerable]]

定義多個屬性

Object.defineProperties(對象obj,對象 其屬性爲obj要添加和修改的屬性)

讀取屬性的特性

Object.getOwnPropertyDescriptor(對象屬性)

參考

《JavaScript高級程序設計》

小結

本文主要介紹了對象屬性的各類特性。其主要包括數據屬性的[[Configurable]][[Enumerable]][[Writable]][[Value]]和訪問器屬性的[[Configurable]][[Enumerable]][[Get]][[Set]]

若有問題,歡迎指正。

相關文章
相關標籤/搜索