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,set,get。 Object.observe已经被废弃。 Object.keys(waterfall) //[ 'name', 'age' ]