对象属性特性(可写,可枚举,可配置)
对象属性的特性 var obj1 = new Object(); Object.defineProperty(obj1,"y",{ value:1; 属性y的值,默认是undefined writable: true/false; enumerble: true/false; configurable: true/false; }); 分析: 首先 第一行代码var obj1 = new Object(),表示创建一个空对象,相当于 var obj1 = { }; {} 叫做 对象字面量 前提是new Object()中没有传入参数,才与{}一样 Object.defineProperty(obj, prop, descriptor)方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 在这儿,obj1 要定义属性的对象,要修改的属性名称 y , descriptor 将被定义或修改的属性描述符(三个,默认都是false)。 其中 :三个描述分别是 writeable:表示是否能修改属性的值 enumerable:表示能否通过for-in循环返回属性,代表属性是否可枚举 configurable:是否能通过delete删除属性从而重新定义属性,能否修改属性的三个特性,或者能否把属性修改为访问器属性,直接在对象上定义属性。 视图找一个不存在的属性,可通过get(存储器属性) 比如这里通过字面量形式创建person对象,有名字,性别属性 var person = { username:"king", sex:"男“, get age(){ return 12; }, set age( val ) { return ("不能设置"+val ) }; console.log( person.username); // king console.log( person.age) ; 12 当执行到console(person.age)代码行时,person.age 试图找到不存在的 age 属性,如果想要得到age属性,在person对象里,前面写上get关键字 ,即可得到age的返回值。 所以,当想要得到age的值的时候,会自动调用写好的 get age(){}方法 如果想要设置age属性的值: person.age = 13; console.log( person.age); //输出 :不能设置13 defineProperty方式创建属性并添加描述 var obj={} Object.definedProperty(obj,"x",{ get : function ( ) { // 注意:通过这种方式 写get方法要通过:冒号分隔 return 123; } }); defineProperties 方式创建多个属性并添加描述 通过字面量以及defineProperty的方法设置属性只能一个一个设置,其实可以用Object的property属性设置多个 var person = {}; Object.defineProperties(person,{ "user" : { //引号可写可不写 ( 属性都是字符串) value:"king", writeable:true, enumerable:true, configuable:true //注意:这儿没有了逗号 以上两个包括本属性,不写 默认是false; }, //注意 逗号 age : { value:12, writeable:false } }); console.log(person.user);//king console.log(person['age']); 访问属性,可直接写名字,也可以加上[],当名字有破折号,就必须加上了,比如person[first-name] console.log( Object.getOwnPropertyDescriptor(person,"user") ); 得到person对象的user属性的描述,返回结果是: Object{ value:"king" , writable:true , enumerable:true , configurable:true } console.log(Object.getOwnPropertyDescriptor(person,"age")); 得到person对象的age属性的描述,返回: Object{ value:12 , writeable:false , enumerable:false, configurable:false} 定义age属性的时候,省略了enumeralb 和configurable的属性描述,所以返回时可以看到,默认是false 如果在person对象里面加上: person.addr = " 北京 “; console.log(Object.getOwnPropertyDescriptor(person,"addr")); 返回结果三个属性描述都是true;