理解Object.defineProperty()

一、Object.defineProperty()语法说明

Object.defineProperty()的作用就是在一个对象上定义一个新属性,或者修改一个已经存在的属性
Object.defineProperty(obj , prop , desc)
obj:需要定义属性的当前对象
prop:当前需要定义的属性名
desc:属性描述符

    <script>
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 19
        })
        console.log(person);//{name: '张三', sex: '男', age: 19}
    </script>

二、属性描述符

1、writable是否只读

注意:当前使用了writable和value属性,不允许使用getter和setter这两个方法

writable:控制属性是否可以被修改(是否只读),默认为false

    <script>
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 19,
            writable: true,//控制属性是否可以被修改,默认值是false
        })
        console.log(person); //{name: '张三', sex: '男', age: 19}
        person.age = 20
        console.log(person);//{name: '张三', sex: '男', age: 20}
    </script>
2、enumerable是否可枚举

描述属性是否会出现在for in或者Object.keys()的遍历中
控制属性是否可枚举,默认值是false

Object.keys(obj)
参数:要返回其枚举自身属性的对象
返回值:一个表示给定对象的所有可枚举属性的字符串数组

    <script>
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 19,
            writable: true, //控制属性是否可以被修改,默认值是false

        })
        let key = Object.keys(person)
        console.log(key);//['name', 'sex']
    </script>

enumerable: true

    <script>
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 19,
            writable: true, //控制属性是否可以被修改,默认值是false
            enumerable: true
        })
        let key = Object.keys(person)
        console.log(key); //(3) ['name', 'sex', 'age']
    </script>
3、configurable是否可以删除

configurable:控制属性是否可以被删除,默认值是fasle

    <script>
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 19,
            writable: true, //控制属性是否可以被修改,默认值是false
            enumerable: true, //控制属性是否可以被枚举,默认值是false
        })

        let de = delete person.age
        console.log(person);//{name: '张三', sex: '男', age: 19}
    </script>

configurable: true

    <script>
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 19,
            writable: true, //控制属性是否可以被修改,默认值是false
            enumerable: true, //控制属性是否可以被枚举,默认值是false
            configurable: true,//控制属性是否可以被删除,默认值是false
        })

        let de = delete person.age
        console.log(person); //{name: '张三', sex: '男'}
    </script>
4、getter和setter

当设置或获取对象的某个属性的值的时候,可以提高getter和setter方法
getter是一种获得属性值的方法
setter是一种设置属性值的方法

    <script>
        let number = 20
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            // 当有人读取person的age属性时候,get函数(getter)就会被调用,且返回值就是age的值
            // get: function() {->简写
            get() {
                return number;
            },
            // 当有人修改person的age属性的时候,set函数(setter)就会被调用,且会收到修改的具体值
            set(value) {
                console.log('有人修改了age属性,且值', value);
                number = value
            }
        })
    </script>

在这里插入图片描述

三、修改属性值

①当configurable:false和writable:true
可以通过定义属性修改值也可以通过赋值的形式修改值

    <script>
        let person = {
                name: '张三',
                sex: '男'
            }
            /* 通过属性定义的形式修改值 */
        Object.defineProperty(person, 'name', {
            value: '李四',
            writable: true, //控制属性是否可以被修改,默认值是false
            configurable: false, //控制属性是否可以被删除,默认值是false
        })


        console.log(person); //{name: '李四', sex: '男'}
        /* 通过赋值的形式修改值 */
        let name = '王五'
        person.name = name
        console.log(person); //{name: '王五', sex: '男'}
    </script>

②当configurable:true和writable:false
可以通过定义属性修改值单数不能通过赋值的形式修改值

    <script>
        let person = {
                name: '张三',
                sex: '男'
            }
            /* 通过属性定义的形式修改值 */
        Object.defineProperty(person, 'name', {
            value: '李四',
            writable: false, //控制属性是否可以被修改,默认值是false
            configurable: true, //控制属性是否可以被删除,默认值是false
        })


        console.log(person); //{name: '李四', sex: '男'}
        /* 通过赋值的形式修改值 */
        let name = '王五'
        person.name = name
        console.log(person); //{name: '李四', sex: '男'}
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值