数据属性和访问器属性

数据属性 访问器属性
共同特性 [[enumerable]]
[[configurable]]
特有特性 [[writable]] [[get]]
[[value]] [[set]]
设置单个属性方法 Object.defineProperty(obj, prop, descriptor)
设置多个属性方法 Object.defineProperties(obj, props)
读取单个属性描述符 Object.getOwnPropertyDescriptor(obj, prop)
读取对象所有属性描述符 Object.getOwnPropertyDescriptors(obj)
备注 obj: 需要被操作的目标对象;
prop: 目标对象需要定义(读取)或修改的属性的名称;
descriptor: 将被定义或修改的属性的描述符;
props: 该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置;

特性详情

  • [[Configurable]]:

    • 表示能否通过delete删除属性从而重新定义属性,(设置为false,表示不能从对象中删除属性(在严格模式下调用delete会报错)),
    • 能否修改属性的特性,
    • 能否把数据属性修改为访问器属性(或相反),
    • true修改为false是单向的,即一旦把把属性定义为不可配置的,就不能再把它变回可配置了(此时只能单向修改writabletruefalse)。
  • [[Enumerable]]: 表示能否通过for-in循环返回属性
  • [[Writable]]: 表示能否修改属性的值
  • [[Value]] : 包含这个属性的数据值
  • [[Get]]: 读取属性时调用的函数,默认值为undefined
  • [[Set]]: 写入属性时调用的函数,默认值为undefined

其中直接在对象上定义的属性,[[Configurable]], [[Enumerable]], [[Writable]]默认值均为true;
通过Object.defineProperty()方法或Object.defineProperties()方法,如果不指定writale, enumerable, configurable 的值,则全部默认为 false。

定义属性

定义单个属性

Object.defineProperty(book, 'actor', {
    value: 'Nicholas'
})

定义多个属性

var book = {}
Object.defineProperties(book,{
    _year:{
        writable: true,
        value: 2004
    },
    edition:{
        writable: true,
        value: 1
    },
    // year为访问器属性
    year:{
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if(newValue > 2004){
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});
// {_year: 2004, edition: 1}

读取属性的描述符

读取单个属性的描述符

Object.getOwnPropertyDescriptor(book, '_year'); 
// {value: 2006, writable: true, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptor(book, 'edition'); 
// {value: 3, writable: true, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptor(book, 'year'); 
// {get: ƒ, set: ƒ, enumerable: false, configurable: false}

Object.getOwnPropertyDescriptor(book, 'actor'); 
// {value: "Nicholas", writable: false, enumerable: false, configurable: false}

读取所有属性的描述符

Object.getOwnPropertyDescriptors(book)

图片描述

注意

从上面代码Object.getOwnPropertyDescriptor()执行结果中可以看出来,通过Object.defineProperty()方法或Object.defineProperties()方法,如果不指定数据属性或访问器属性的writale, enumerable, configurable 的值,则全部默认为 false

吉叶
46 声望4 粉丝