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' ]
原文地址:https://www.cnblogs.com/wulinzi/p/10400813.html