面向對象的程序設計
面向對象的語言都有一個標誌,那就是它們都有類的概念,但ECMAScript中沒有類的概念,ECMA-262中把對象定義爲:“無序屬性的集合,其屬性可以包含基本值、對象或者函數”。
每個對象都是基於引用類型創建的,引用類型可以是原生類型,也可以是開發者定義的類型。
理解對象
最簡單的創建自定義對象的方法(創建一個object實例),然後再爲它添加屬性和方法。
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = Softeware Engineer";
person.sayName = function (){
alert(this.name);
}
上面例子,通過對象字面量的寫法:
var person = {
name:"Nicholas",
age:29,
job:Software Engineer,
sayName:function(){
alert(this.name);
}
}
屬性類型
ECMAScript中有兩種屬性:數據屬性和訪問器屬性。
1.數據屬性
數據屬性可以通過Object.defineProperty()方法修改屬性的默認特性。
var person = {};
Object.defineProperty(person,"name",{
writable:false,
value:"Nicholas"
});
2.訪問屬性
包含一對getter和setter函數也需要Object.defineProperty()來定義。
定義多個屬性
通過Object.defineProperties()方法定義多個屬性。
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;
}
}
}
});
讀取屬性的特性
通過Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。
這個方法可以接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱。
返回值是一個對象,如果是訪問器屬性,這個對象的屬性有configurable、enumerable、get和set;如果是數據屬性,這個對象的屬性有configurable、enumerable、writable和value。
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.getOwnPerpertyDescriptor(book,"_year");
descriptor.value //2004
descriptor.configurable //false
typeof descriptor.get //"undefined"
var descriptor2 = Object.getOwnPerpertyDescriptor(book,"year");
descriptor2.value //undefined
descriptor2.enumerable //false
typeof descriptor.get //"function"