面向对象的程序设计
ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”我们可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。
属性类型
对象包括四个属性类型:
- [[Configurable]]:表示可以使用delete 操作符删除属性,
- [[Enumerable]]:表示可以用for-in循环属性,
- [[Writable]]:表示能否修改属性,
- [[Value]]:包含属性的数据值。
要修改属性默认的特性,必须使用ECMAScript 5 Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。。其中,描述符(descriptor)对象的属性必须是:configurable、enumerable、writable 和value。
var person = {};
Object.defineProperty(person, "name", {
writable: false,//设置不可修改属性
value: "Tom"
});
alert(person.name); //"Tom"
person.name = "Jake";
alert(person.name); //"Tom"
//配置configurable属性:
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Tom"
});
alert(person.name); //"Tom"
delete person.name;//这里删除不会生效
alert(person.name); //"Tom"
注意:一旦把属性定义为不可配置的,就不能再把它变回可配置了。此时,再调用Object.defineProperty()方法修改除writable 之外的特性,都会导致错误。
定义多个属性,可以使用方法:Object.defineProperties()方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。
var person = {};
Object.defineProperties(person,{
name:{value:'Tom'},
age:{value:24}
})
读取对象属性:
Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false