Javascript 属性有四个特性:
属性描述符的使用规则,违反规则的操作将抛出异常:
- configurable 是否可以删除和修改该属性
- enumerable 是否可以通过for/in循环返回该属性
- value 属性的值
- writable 是否可以修改该属性的值
//声明类和类的构造函数 function Person(name,age){ this.name=name; //类的属性 this.age=age; this.sayHello=function(){ //类的方法 document.writeln("Hello I'm " + this.name); } this.setName=function(name){ this.name=name; } this.setAge=function(age){ this.age=age; } } var person = new Person('xiao', 21); var name_pro =Object.getOwnPropertyDescriptor(person,'name'); document.writeln(name_pro.configurable); //是否可以删除和修改该属性 document.writeln(name_pro.enumerable); //是否可以通过for/in循环返回该属性 document.writeln(name_pro.value); document.writeln(name_pro.writable); //是否可以设置该属性的值 name_pro.writable=false; name_pro.configurable=false; name_pro.enumerable=false; person.name='him'; document.writeln(person.name); //=>him, 很奇怪name属性仍然被修改 document.writeln('='+Object.keys(person)+'='); //=>name,age,sayHello,setName,setAge 很奇怪设置无效 //定义新的属性 Object.defineProperty(person, 'weight', {value:100, writable:true, enumerable:true, cofigurable:false}); document.writeln(person.weight); //修改已有属性 Object.defineProperty(person, 'weitht', {writable:false, enumerable:false}); person.weight=120; document.writeln(person.weight); //=>120 document.writeln('='+Object.keys(person)+'='); //name,age,sayHello,setName,setAge,weight 很奇怪设置无效 //批量新建属性 Object.defineProperties(person, { sex:{value:'male', writable:true, enumerable:false, configurable:false}, language:{value:'Chinese', writable:true, enumerable:false, configurable:false}, });
属性描述符的使用规则,违反规则的操作将抛出异常:
- 1. 如果对象是不可扩展的,则可以编辑已有的属性,但不能添加新属性。
- 2. 如果属性是不可配置的,则不能修改他的可配置性和可枚举性
- 3. 如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换为数据属性。
- 4. 如果数据属性是不可配置的,则不能将它转换为存取器属性。
- 5. 如果数据属性是不可配置的,则不能将他的可写性从false改为true,但可以从true改为false。
- 6. 如果数据属性是不可配置且不可写的,则不能修改他的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可以写的)。