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' ]
  • 相关阅读:
    swift 第十四课 可视化view: @IBDesignable 、@IBInspectable
    swift 第十三课 GCD 的介绍和使用
    swift 第十二课 as 的使用方法
    swift 第十一课 结构体定义model类
    swift 第十课 cocopod 网络请求 Alamofire
    swift 第九课 用tableview 做一个下拉菜单Menu
    swift 第八课 CollectView的 添加 footerView 、headerView
    swift 第七课 xib 约束的优先级
    swift 第六课 scrollview xib 的使用
    swift 第五课 定义model类 和 导航栏隐藏返回标题
  • 原文地址:https://www.cnblogs.com/wulinzi/p/10400813.html
Copyright © 2011-2022 走看看