標籤:執行個體化 prototype glob 自訂 this 方法 做了 區別 支援
JavaScript對象對象
ECMA-262 把對象(object)定義為“屬性的無序集合,每個屬性存放一個原始值、對象或函數”。嚴格來說,這意味著對象是無特定順序的值的數組。
對象是屬性和方法的無序集合
對象就是無序屬性的集合
儘管 ECMAScript 如此定義對象,但它更通用的定義是基於代碼的名詞(人、地點或事物)的表示。
在JavaScript中,除了數字、字串、布爾值、null、undefined這五種原始類型,之外的都是對象,也就是印證了“萬物皆對象”的說法。
對象是一種複合值,它將很多值彙總在一起,(這些值可能是原始類型或者其他對象),可以通過屬性名稱訪問這些值,而屬性名稱是可以包含Null 字元串的任一字元串。
JavaScript對象也是一種資料結構,可以使用instanceof 運算子用來測試一個對象在其原型鏈中是否存在一個建構函式的 prototype 屬性。
對象的類型:在 ECMAScript 中,所有對象並非同等建立的。
一般來說,可以建立並使用的對象有三種:
1、 本機物件(native object)
ECMA-262 把本機物件(native object)定義為“獨立於宿主環境的 ECMAScript 實現提供的對象”。簡單來說,本機物件就是 ECMA-262 定義的類(參考型別)。
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
2、 內建對象(built-in object)
ECMA-262 把內建對象(built-in object)定義為“由 ECMAScript 實現提供的、獨立於宿主環境的所有對象,在 ECMAScript 程式開始執行時出現”。這意味著開發人員不必明確執行個體化內建對象,它已被執行個體化了。ECMA-262 只定義了兩個內建對象,即 Global 和 Math (它們也是本機物件,根據定義,每個內建對象都是本機物件)。
3、 宿主對象(host object)
即JavaScript解譯器所嵌入的宿主環境(比如瀏覽器)定義的,例如HTMLElement等;
對象屬性:
1、 自有屬性(own property):直接在對象中定義的屬性;
2、 繼承屬性(inherited property):在對象的原型對象中定義的屬性
物件導向語言的要求
一種物件導向語言需要向開發人員提供四種基本能力:
- 封裝 - 把相關的資訊(無論資料或方法)儲存在對象中的能力
- 聚集 - 把一個Object Storage Service在另一個對象內的能力
- 繼承 - 由另一個類(或多個類)得來類的屬性和方法的能力
- 多態 - 編寫能以多種方法啟動並執行函數或方法的能力
ECMAScript 支援這些要求,因此可被看做是物件導向的。
JavaScript還是一門基於對象的弱類型語言
基於對象:內建大量對象,只要少量代碼可以完成工作
弱類型:對類型要求不嚴格
對象的構成
在 ECMAScript 中,對象由特性(attribute)構成,特性可以是原始值,也可以是引用值。如果特性存放的是函數,它將被看作對象的方法(method),否則該特性被看作對象的屬性(property)。
對象的建立
1.對象直接量(字面量)
對象直接量由若干名/值對組成的映射表,名/值對中間用冒號分隔,名/值對之間用逗號分隔,整個映射表用花括弧括起來。屬性名稱可以是JavaScript標識符也可以是字串直接量,也就是說下面兩種建立對象obj的寫法是完全一樣的:
var obj = {x: 1, y: 2};var obj = {‘x‘: 1, ‘y‘:2};
2.通過new建立對象(建構函式方式)
new運算子後跟隨一個函數調用,即建構函式,建立並初始化一個新對象。
var computer=new Object();computer.size=15.6;computer.color=‘黑色‘;computer.price=‘6999¥‘;computer.brand=‘DELL‘;computer.open=function () { console.log(‘砸碎‘);}computer.close=function () { console.log(‘因為關機被砸壞,需要買新機‘);}
3.Object.create()
ECMAScript5定義了一個名為Object.create()的方法,它建立一個新對象,其中第一個參數是這個對象的原型對象
對象的建構函式
自訂建構函式
建構函式,本質上也是函數,要用function關鍵字聲明
命名:使用你所想描述的對象的名稱來命名,首字母大寫(約定俗成的規定)在建構函式中使用this代替對象
function student(number,age,gender,name,level) { this.number=number; this.age=age; this.gender=gender; this.name=name; this.level=level; this.doHomework=function () { console.log(‘大家好,我是‘+this.level+‘的‘+this.name+‘,一個喜歡開車的‘+gender); } this.runOutClass=function () { console.log(‘逃課是因為喜歡開車‘); }}var stu1=new student(‘20‘,18,‘男人‘,‘k哥‘,‘三年級‘);stu1.doHomework();stu1.runOutClass();console.log(stu1);
this關鍵字
1、在建構函式內部: this是指代建構函式內部的當前對象
2、在普通函數內部:在函數調用的時候,this指向調用這個函數的對象,誰調用這個函數(方法),函數中的this就是誰
new 關鍵字
做了哪些事情:
1、建立了一個對象,並且把這個對象存在了this裡面
this = new Object();
2、執行建構函式裡的代碼,為建立的對象添加屬性和方法
3、把this返回給調用建構函式的地方
return this;
訪問對象的屬性
1、通過點的方式:對象.屬性
2、通過鍵的方式:對象[屬性對應的名稱字串]
使用for-in格式遍曆對象的屬性
格式:
for ( var 屬性名稱 in 要遍曆的對象 ) {
你希望要寫的代碼
}
基本類型和參考型別
基本類型:
數字、字串、布爾、undefined、null
參考型別:Object
基本和參考型別的區別
1、儲存的位置不一樣
基本類型是儲存在棧上的
參考型別是儲存在堆上的
2、發生傳參的時候
基本類型是複製一份進入函數參與運算的
參考型別,複製的是儲存在棧上的記憶體位址,這個記憶體位址是指向堆中的對象的。所以在函數執行的時候,實際上操縱的是同一個對象
基本類型傳參,不會改變實參的
參考型別傳參,會改變實參
JavaScript對象淺談