Object.defineProperty和Object.defineProperties
添加属性到对象,或修改现有属性的特性
用法:
Object.defineProperty(object, propertyName, descriptor);
参数:
object : 作用的对象,可以是javascript对象,或dom对象。
propertyName : 属性名,字符串。
descriptor : 属性的特性描述,区分数据属性或访问器属性。
返回值:
修改后的对象。
异常:
1. object不是对象。
2. object不可扩展。
3. descriptor有value或writable特性,同时有get和set特性。
4. descriptor的get和set特性不是函数。
5. 对象的属性名已存在,同时descriptor的configurable特性为false,且descriptor包含一个以上与现有属性的特性不同的特性。但configurable为false,且writable为true时,允许value或writable特性不同。
defineProperties和defineProperty差不多,就不介绍了。
例子:
'use strict'; (function(){ if(!Object.defineProperty){ console.log('浏览器不支持defineProperty'); return; } var person = {}; //向person添加name属性和它的访问器 Object.defineProperty(person, 'name', { set : function(n){ console.log('set 访问器'); this.nameValue = n; //一个新的属性,如果同样是name的话,就死循环了。 }, get : function(){ console.log('get 访问器'); return 'my name is ' + this.nameValue; }, //value : 'jeck', //如果在这里有value或writable特性,就会报错:Uncaught TypeError: Invalid property. A property cannot both have accessors and be writable or have a value。 enumerable: true, configurable: true }); person.name = "haha"; //触发set访问器 console.log(person.name); //触发get访问器 output: my name is haha console.log(person.nameValue); //output: haha //向person添加id数据属性。 Object.defineProperty(person, 'id', { value : '1234567890', writable : false, enumerable : false, configurable : false }); console.log(person.id); //output: 1234567890 //person.id = '0987654321'; //报错,因为id是只读的,不可写。 //列出对象的属性 var propertyNames = Object.getOwnPropertyNames(person); for(var i = 0, len = propertyNames.length; i < len; i++){ var name = propertyNames[i] console.log(name + ': ' + person[name]); } /*output: name: my name is haha nameValue: haha id: 1234567890*/ //列出某一属性的所有特性。 var descriptor = Object.getOwnPropertyDescriptor(person, 'id'); descriptor.writable = true;//这里将原来的writable特性改为了true。 for(var prop in descriptor){ console.log(prop + ': ' + descriptor[prop]); } /*output: value: 1234567890 writable: true enumerable: false configurable: false*/ //defineProperty的复数版: Object.defineProperties(person, { sex : { value : 'boy', writable : true, enumerable : false, configurable : true }, age : { set : function(x){ this.ageValue = x; }, get : function(){ return this.ageValue; } } }); person.sex = 'girl'; //变性成功! person.age = 23; console.log('sex: ' + person.sex); console.log('age: ' + person.age); /*output: sex: girl age: 23*/ })();