创建自定义对象最简单的方式是创建一个Object的实例:
var person = new Object() person.name = 'adhehe' person.age = 23 person.job = '程序开发' person.getName = function(){ return this.name }
使用对面字面量创建一个普通对象实例:
var person = { name:'adhehe', age:23, job:'程序开发', getName:function(){ return this.name } }
ECMAScript中有两种属性类型
- 数据属性
- 访问器属性
数据属性
它包含一个数据值的位置,在这个位置可以读取和写入值。
[[Configurable]]:
- 能否delete删除属性从而重新定义属性
- 能否修改属性的特性
- 能否把属性修改为访问器属性
- 直接在对象上定义的属性,Configurable 默认值为true
[[Enumerable]]:
- 能否通过 for-in 循环返回属性
- 直接在对象上定义的属性,Enumerable 默认值为true
[[Writable]]:
- 能否修改属性的值
- 直接在对象上定义的属性,Enumerable默认值为true
[[Value]]:
- 包含这个属性的数据值
- 读取属性值的时候,从这个位置读取
- 写入属性值的时候,把新值保存在这个位置
- 默认值为undefined
要修改属性默认的特性,必须使用 Object.defineProperty()方法:
var person = {} Object.defineProperty(person,'name',{ configurable:false,
enumerable:true, writable:false, value:'adhehe' })
//一旦把属性定义为不可配置的,就不能再把它变回可配置了
//在调用此方法创建的新的属性时,如果不指定,则configurable、enumerable、writable默认值都为false
访问器属性
它不包含数据值,它包含一对getter函数和setter函数
[[Configurable]]:
- 能否delete删除属性从而重新定义属性
- 能否修改属性的特性
- 能否把属性修改为访问器属性
- 直接在对象上定义的属性,Configurable 默认值为true
[[Enumerable]]:
- 能否通过 for-in 循环返回属性
- 直接在对象上定义的属性,Enumerable 默认值为true
[[Get]]:
- 读取属性时调用的函数
- 默认值为undefined
- 如果未指定此函数,则属性不可读取
[[Set]]:
- 写入属性时调用的函数
- 默认值为undefined
- 如果未指定此函数,则属性不可写入
访问器属性不能直接定义,必须使用 Object.defineProperty()来定义。
var person = { name:'adhehe', _age:23 } Object.defineProperty(person,'age',{ get:function(){ return this._age; }, set:function(newVal){ if(newVal > 59){ this._age = 'old'; }else{
this._age = newVal;
} } }) person.age = 45; console.log(person.age)//输出 45 person.age = 65; console.log(person.age)//输出 old
Object.defineProperties()方法可一次定义多个属性:
var person = {} Object.defineProperties(person,{ name:{ writable:true, value:'adhehe' }, _age:{ writable:true, value:23 }, age:{ get:function(){ return this._age; }, set:function(newVal){ if(newVal > 59){ this._age = 'old'; }else{ this._age = newVal; } } } })
Object.getOwnPropertyDescriptor()方法可取得给定属性的描述符:
//以前面person为例 var desc = Object.getOwnPropertyDescriptor(person,'name');
console.log(desc.value) //adhehe
console.log(desc.configurable) //false
console.log(desc.get) //undefined