函数可以设置对象属性。例如,为对象设置新属性或修改现有属性。使用示例Object.defineProperty(obj,key,{value:val,enumerable:true,writable:true,configurable:false,get:function(){},set:function(){},});参数说明obj:修改属性的对象,key:定义或修改属性值,writable:对属性的赋值是否生效,enumerable:属性是否可以遍历forin,configurable:是否可以配置,可以修改除可写属性外的其他特性。只有当属性为真时,才能删除,更改可枚举属性,否则会报错。分配总是可能的。接下来定义一个空对象,然后使用Object.defineProperty方法为这个空对象定义一个新的属性,并将其writable参数设置为true。varobj={};Object.defineProperty(obj,'test',{value:'test1',writable:true,});console.log(obj);//obj{test:test1}然后更改test属性价值。因为writeble的值为true,所以可以更改test属性的值。obj.test="test2";//obj{test:test2}如果writable的值为false,则不会改变test属性的值。object.defineProperty(obj,'test',{writable:false,});obj.test="test3";//obj{test:test2}enumerable判断对象是否可以通过forin遍历到属性。true表示表示可以通过forin遍历该属性。设置configurable时enumerable的设置必须设置为true才能生效。Object.defineProperty(obj,'test',{enumerable:!!false,configurable:true});for(varproinobj){console.log(pro+':'+obj[pro]);}//没有打印出任何值,只有当configurable的值为true时才能删除该属性。deleteobj.test;//成功删除属性每个对象属性都有默认的get和set方法,我们可以重写。varmyValue;Object.defineProperty(obj,'haha',{set:function(){//get和set要一起设置myValue='testtest';},get:function(){returnmyValue;},enumerable:true,});for(varproinobj){console.log(pro+':'+obj[pro]);}//haha:undefinedconsole.log(obj.haha);//undefinedobj.haha='777';console.log(obj.haha);//testtest只有haha被赋值时,obj.haha属性才会被赋值set,否则为undefined。不过哈哈这个属性在赋值之前已经定义好了。使用场景自定义构造函数中的set和get方法。函数测试(){varpro=null;Object.defineProperty(this,"pro",{get:function(){returnpro;},set:function(value){pro=value}});}varmytest=newTest();//等价toexecutingthemethodoncemytest.pro=haha??;console.log(mytest.pro);//haha使用构造函数主要是为了限制自定义set和get方法的适用范围,比如上面的代码,限制这些我测试的两种方法。我对上面这段代码的理解是这样的:varTest1=function(){functiongg(){this.tt=1;}gg.call(这个);};vartest=newTest1();控制台日志(测试.tt);参考链接:Object.defineProperty()
