面向对象(理解对象)——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]]

若有问题,欢迎指正。

相关文章
相关标签/搜索