对象属性特性(可写,可枚举,可配置)



对象属性的特性

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; 
原文地址:https://www.cnblogs.com/feng-xl/p/9318428.html