当前位置: 首页 > Web前端 > HTML

javascript----object---创建对象的方式和defineproperty的使用方式

时间:2023-03-28 19:56:51 HTML

1.创建对象的方式第一种创建方式:通过newObject()varobj=newObject();obj.name="jeonghan";obj.age=19;obj.running=function(){console.log(this.name+"running");};console.log(obj);创建方法二:文字形式varobj2={name:"wonwoo",age:18,eating:function(){console.log(this.name+"eating");},};console.log(obj1);2.对象属性的基本操作varobj={name:"david",age:11,};//获取属性//console.log(obj.name);//david//删除属性deleteobj.age;//console.log(obj);//obj{name:david}//复制属性obj.name="joshua";//console.log(obj.name);//obj{name:joshua}```属性操作符要求:在操作对象中的某些属性时,有一些限制,例如:某些属性不允许被删除、修改、遍历和赋值。如果要加上这些限制,就必须使用属性描述符,属性描述符需要使用object.defineproperty()方法定义第一个参数:要操作的对象。第二个参数:要操作的对象的属性。如果要操作的对象中不存在该属性,则将其添加到元对象中。三个参数:属性描述符,对象形式//Object.defineProperty会改变原对象的值Object.defineProperty(obj,"age",{value:1.88,});//使用defineproperty对原对象进行操作后object,读取原始对象obj看不到新增的age属性//console.log(obj);//obj{name:'jo??shua'}//obj对象里好像没有这个属性,其实应该是对象现在有age属性,但是这个属性目前是不可枚举的。属性描述符可以分为两类:1.数据属性描述符//configurable:当这个值为false时,表示该属性不能被修改或删除,并且不能被更改为访问属性。当直接在对象上定义属性时,此值为true。//enumerable:当这个值为false时,表示该属性不能被forin或Object.keys返回。当直接在对象上定义属性时,该值为true。//writable:当该值为false时,表示该属性不可修改。直接在对象上定义属性时,值为true//value:属性的值,读取属性时返回,修改属性时修改constobj2={sname:"wonwoo",age:19,};Object.defineProperty(obj2,"address",{value:"SeoulCity",//configurable:false,enumerable:true,writable:true,});deleteobj2.address;//如果直接logobj2,address属性显示为灰色,表示无法读取,可以以点的形式获取该属性//所以上面的delete不生效//console.log(obj2.address);//console.log(Object.keys(obj2));------['sname','age','address']obj2.address="Busan";//console.log(obj2.address);//Seoul2.访问属性描述符//configurableenumerablegetsetObject.defineProperty(obj2,"sno",{configurable:true,enumerable:true,get(){},set(){},});//使用case1:当我们不想随便暴露对象中的某个属性时varobj3={name:"woozi",age:"16",//js中定义私有属性的一般方式只需在里面加一个下划线front_address:"北京",};Object.defineProperty(obj3,"address",{configurable:true,enumerable:true,get:function(){//valuereturnth是._地址;},set:function(value){//赋值this._address=value},});//这样就不能直接通过访问属性描述符来访问私有属性,但是也可以获得函数的private属性的值//我不太清楚这个东西是用来做什么的console.log(obj3.address);//北京obj3.address="上海"console.log(obj3.address);//上海市//用法2:如果我们想拦截访问和设置某个属性的过程,也可以使用访问属性描述符对象方法的补充//获取对象中某个属性的属性Descriptorvarobj={name:"zhangruiqing",age:18,};console.log(Object.getOwnPropertyDescriptor(obj,"name"));//{value:'zhangruiqing',writable:true,enumerable:true,configurable:true}//获取对象中的所有属性描述符console.log(Object.getOwnPropertyDescriptors(obj));//{age:{value:18,writable:true,enumerable:true,configurable:true},name:{value:'zhangruiqing',writable:true,enumerable:true,configurable:true}}对象对对象的方法限制varobj={name:"jinghan",age:78,};//对象可以使用.preventExtensions组织对象继续添加属性//Object.preventExtensions(obj)console.log(obj);//{name:'jinghan',age:78}//2.禁止对象配置/删除对象中的属性//seal方法可以使对象中所有属性不可配置添加或删除属性但可以修改属性值Object.seal(obj);obj.address="北京";obj.name="北京";console.log(对象);//{name:'北京',age:78}//3.禁止对象修改Object.freeze(obj);obj.name="qqqqq";console.log(obj);//{姓名:'北京',年龄:78}