title: 面向对象编程01
对象:无序属性的集合,其属性可以包含基本值,对象,或者函数。
理解对象
创建自定义对象的首选方法为对象字面量形式:
var person = {
name: 'benjamin',
age: 22,
job: 'Front End Engineer',
sayName: funtion(){
alert(this.name);
}
};
属性类型
JS中有两种属性:数据属性和访问器属性。
数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特质。
如果需要修改属性的默认特性,必须使用Object.defineProperty()方法。此方法接受三个参数:属性所在的对象,属性名和一个描述符(descriptor)对象。描述符对象的属性必须是:configurable、enumerable、writable和value。
var person = {};
Object.defineProperty(person,'name',{
writable: false,
value: 'benjamin'
});
alert(person.name) //'benjamin'
person.name = 'llf';
alert(person.name) //'benjamin'
无法提供赋值形式修改'name'的值。该规则对于configurable同样适用。而且一旦将属性定义为不可配置后,就无法再将它变回可配置了。
访问器属性
访问器属性不包含数据值;它包含一对getter和setter函数。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责如何处理数据。
访问器属性具有以下四个特性:
由于访问器属性不可以直接定义,必须使用Object.defineProperty()来定义。
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book,'year',{
get: function () {
return this._year;
},
set: function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
访问器属性通常用于设置一个属性的值会导致其他属性的变化
定义多个属性
利用Object.defineProperties()可以通过描述符一个定义多个属性。此方法接受两个对象参数:第一个对象为要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。
var book = {};
Object.defineProperties(book,{
_year: {
writable: true,
value: 2004
},
edition: {
writable: true,
value: 1
},
year: {
get: function () {
return this._year;
}.
set: function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
})
读取属性特性
利用Object.getOwnPropertyDescriptor()方法可以去属性的描述符。该方法接受两个参数:属性所在的对象名以及要读取其描述符的属性的名称。返回值是一个对象,如果是访问器属性。该对象的属性就有configurable、enumerable、get、set;如果是数据属性。那就是configurable、enumerable、writable、value。
var descriptor = Object.getOwnPropertyDescriptor(book,'_year');
alert(descriptor.value); //2004
alert(descriptor.configurable); //false