zoukankan      html  css  js  c++  java
  • javascript的Object对象的defineProperty和defineProperties

    Object的属性

    查看官网:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object
    
    第一段代码:
    var person={};
    Object.defineProperty(person,'name',{
        configurable:true,//能否使用delete、能否修改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true
        enumerable:false,//对象属性是否可通过for-in循环,flase为不可循环,默认值为true
        //writable:true,//对象属性是否可修改,flase为不可修改,默认值为true
        //value:'huang', //对象属性的默认值,默认值为undefined
        set:function(newValue){
            this.name=newValue;
        },
        get:function(){
            return this.name;
        }
    });
    
    当get,set出现的时候不能出现value和writable,
    否则报错:Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>
        at Function.defineProperty (<anonymous>)
        at <anonymous>:2:8
    
    
    
    
    
    第二段代码:
    var waterfall={};
    Object.defineProperty(waterfall,'name',{
        configurable:true,//能否使用delete、能否修改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true
        enumerable:false,//对象属性是否可通过for-in循环,flase为不可循环,默认值为true
        //writable:true,//对象属性是否可修改,flase为不可修改,默认值为true
        //value:'huang', //对象属性的默认值,默认值为undefined
        set:function(newValue){
            this.name=newValue;
        },
        get:function(){
            return "Namess"+this.name;
        }
    });
    问题:这段代码会报错,因为在set和get函数里出现了this.name= 和 return 里有this.name
    导致一直循环递归无法停止,才报错的。
    类似于:
        function a() {
            a();
        }
    调用a,会无限循环。
    
    解决办法是:
    var waterfall={};
    Object.defineProperty(waterfall,'name',{
        configurable:true,//能否使用delete、能否修改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true
        enumerable:false,//对象属性是否可通过for-in循环,flase为不可循环,默认值为true
        //writable:true,//对象属性是否可修改,flase为不可修改,默认值为true
        //value:'huang', //对象属性的默认值,默认值为undefined
        set:(newValue)=>{
            this.name=newValue;
        },
        get:()=>{
            return "Namess"+this.name;
        }
    });
    
    
    
    
    
    Object.defineProperties(object, props)
    参数
    object: 定义的对象
    props: 添加的属性, key和 value 分别Object.defineProperty 中的第二和第三个参数。
    例子:
    
    let waterfall={};
    Object.defineProperties(waterfall,{
        name:{
            configurable:true,
            enumerable:true,
            set:(val)=>{
                this.name=val
            },
            get:()=>{
                return this.name
            }
        },
        age:{
            configurable:true,
            enumerable:true,
            set:(val)=>{
                this.age=val
            },
            get:()=>{
                return this.age
            }
        }
    })
    
    
    
    
    Object的6个属性:
    configurable,enumerable,writable,value,setget。
    
    
    Object.observe已经被废弃。
    Object.keys(waterfall) //[ 'name', 'age' ]
  • 相关阅读:
    iOS NSNotificationCenter 使用姿势详解
    iOS 数据源切换混乱问题
    iOS 内存管理的一点小问题
    iOS多线程GCD简介(二)
    iOS多线程GCD简介(一)
    iOS Touch Id 开发
    多线程之NSOperation简介
    开始Swift学习之路
    iOS自动布局学习(UIView+AutoLayout)
    善用#waring,#pragma mark 标记
  • 原文地址:https://www.cnblogs.com/wulinzi/p/10400813.html
Copyright © 2011-2022 走看看