在面嚮對象語言中都有類的概念,經過類來建立具備屬性和方法的對象。而ECMAScript中沒有類的概念,ECMAScript中定義了對象:無需屬性的集合,其屬性值能夠包含基本值、對象、或者函數。 javascript
在Javascript中每一個對象都是基礎引用類型來建立的,能夠是原生類型也能夠是自定義的類型。 java
自定義對象最簡單的方法就是經過建立Object類型的實例,而後爲這個實例添加屬性和方法。 瀏覽器
var Person = new Object(); 函數
Person.name = "yangxunwu"; this
Person.age = 24; spa
Person.sayName = function(){ 對象
alert(this.name); ip
}; 字符串
咱們這裏建立了一個object類型的一個名爲Person的對象,有兩個屬性name和age,一個方法sayName; get
屬性類型:
對象擁有屬性,這些屬性也有一些特性,好比Configurable、Enumerable、Writable、Value。在javascript不能直接訪問這些特性,需經過對象的方法訪問,好比Object.defineProperty()
數據屬性:數據屬性包含這個數據值的位置,在這個位置能夠讀取和寫入值。數據屬性有四個特性:
Configurable:可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,可否把屬性修改成訪問器屬性。
Enumerable:可否經過for-in循環返回屬性。
Writable:可否修改屬性值。
Value:保持這個屬性的數據值。
var Person = {
name: "yangxunwu",
}
Object.defineProperty(Person, "age", {
writable: false,
value: 24
})
定義一個Person對象,並設置一個不可寫的值爲24的age屬性。注意定義屬性時的屬性字符串形式。當把屬性的configurable特性設置爲false時,沒法在次修改,只能使用writable。
訪問器屬性: 訪問器屬性不包含值,包含一對getter和setter函數,訪問訪問器屬性時調用getter函數,這個函數返回有效的值,寫入訪問器屬性時調用setter函數,並傳入新值。訪問器屬性包含四個特性:
Configurable:可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,可否把屬性修改成數據屬性。
Enumerable:可否經過for-in循環返回屬性。
Get:讀取數據時調用的函數。默認undefined
Set:寫入屬性時調用的函數。默認undefined
var Person = {
_year : 1992,
age : 0
}
Object.defineProperty(Person, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 1992){
this._year = newValue;
this.age = newValue - 1992;
}
}
})
給Person對象,定義了一個訪問器屬性year,訪問時返回對象的__year屬性,賦值時會調用set函數,而後同時設置age的值。
部分瀏覽器也能夠經過_defineGetter__和 __defineSetter__來設置訪問器特性。也能夠設置多個特性Object.defineProperties()。要讀取一個屬性的特性,能夠經過給定屬性的描述符。
Object.getOwnPropertyDescriptor()方法,返回一個對象,包含各類特性的屬性,能夠針對BOM和DOM對象來使用。
ECMAScript定義這些特性的目的是爲了實現Javascript引擎用的