Javascript 属性有四个特性:
[list]
[*]configurable 是否可以删除和修改该属性
[*]enumerable 是否可以通过for/in循环返回该属性
[*]value 属性的值
[*]writable 是否可以修改该属性的值
[/list]
属性描述符的使用规则,违反规则的操作将抛出异常:
[list]
[*]1. 如果对象是不可扩展的,则可以编辑已有的属性,但不能添加新属性。
[*]2. 如果属性是不可配置的,则不能修改他的可配置性和可枚举性
[*]3. 如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换为数据属性。
[*]4. 如果数据属性是不可配置的,则不能将它转换为存取器属性。
[*]5. 如果数据属性是不可配置的,则不能将他的可写性从false改为true,但可以从true改为false。
[*]6. 如果数据属性是不可配置且不可写的,则不能修改他的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可以写的)。
[/list]
[list]
[*]configurable 是否可以删除和修改该属性
[*]enumerable 是否可以通过for/in循环返回该属性
[*]value 属性的值
[*]writable 是否可以修改该属性的值
[/list]
//声明类和类的构造函数
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},
});
属性描述符的使用规则,违反规则的操作将抛出异常:
[list]
[*]1. 如果对象是不可扩展的,则可以编辑已有的属性,但不能添加新属性。
[*]2. 如果属性是不可配置的,则不能修改他的可配置性和可枚举性
[*]3. 如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换为数据属性。
[*]4. 如果数据属性是不可配置的,则不能将它转换为存取器属性。
[*]5. 如果数据属性是不可配置的,则不能将他的可写性从false改为true,但可以从true改为false。
[*]6. 如果数据属性是不可配置且不可写的,则不能修改他的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可以写的)。
[/list]