JavaScript对象内部属性及其特性总结

本文详细讲解JavaScript中数据属性和访问器属性的区别与联系,包括它们的特性如[[Configurable]], [[Enumerable]], [[Writable]]等,并介绍了如何使用Object.defineProperty和Object.defineProperties方法来定义和修改这些属性。

数据属性和访问器属性

数据属性访问器属性
共同特性[[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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值