'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*/ })();