美文网首页
Object.defineProperty()死循环的问题

Object.defineProperty()死循环的问题

作者: 易冷zzz | 来源:发表于2020-12-09 11:34 被阅读0次

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
    语法:

    Object.defineProperty(obj, prop, descriptor)
    

    obj:要定义属性的对象
    prop:要定义或修改的属性的名称或 Symbol
    descriptor:要定义或修改的属性描述符

    image.png
    数据描述符:
                
                let obj = {}
                Object.defineProperty(obj, 'name', {
                    value: 1,
                })
                console.log(obj.name)//1
                obj.name = 'zqf'
                console.log(obj.name)//1
                
                let obj = {}
                Object.defineProperty(obj, 'name', {
                    value: 1,
                    writable: true
                })
                console.log(obj.name)//1
                obj.name = 'zqf'
                console.log(obj.name)//zqf
    

    存取描述符:

               
                let obj = {
                    initValue: '1',
                }
                Object.defineProperty(obj, 'name', {
                    get(){
                        return obj.initValue
                    },
                    set(value) {
                        obj.initValue = value
                    }
                })
                console.log(obj.name)
                obj.name = 'zqf'
                console.log(obj.name)
                
    

    使用存取描述符遇到的问题:
    当Object.defineProperty设置的prop和obj原有的prop相同时会造成死循环,如下面的initValue属性

                let obj = {
                    initValue: '1',
                }
                Object.defineProperty(obj, 'initValue', {
                    get(){
                        return obj.initValue
                    },
                    set(value) {
                        obj.initValue = value
                    }
                })
                console.log(obj.initValue)
                obj.initValue = 'zqf'
                console.log(obj.initValue)
    

    原因:
    console.log(obj.initValue)触发get方法,return obj.initValue再次触发get方法
    obj.initValue = 'zqf'触发set方法,obj.initValue = value再次触发set方法

    详细的说明请看MDN文档

    相关文章

      网友评论

          本文标题:Object.defineProperty()死循环的问题

          本文链接:https://www.haomeiwen.com/subject/yzfhgktx.html