面向對象的概念
1、概念:
?????? 從編程思想角度理解:面向過程的編程思想,關注解決問題的步驟;面向對象的編程思想,關注的是解決問題所需的對象。面向對象的編程思想繼承自面向過程。
現有的兩種程序思想:
????? 面向過程:關注的是解決問題的步驟
??????????? 優點:在小型程序中代碼量量?比較少,開發成本低
??????????? 缺點:在構建大型項目時,代碼邏輯不易捋順、代碼量太大、程序編寫繁瑣,增加開發? 難度。
???? 面向對象:關注的是解決問題所需的對象
??????????? 優點:有效彌補了面向過程編程思想的不足。
??????????? 缺點:在小型程序中不如面向過程思想靈活、方便。
??????????? 從編程語言角度理解:面向對象的編程語言,必須有“類”和“對象”這兩個概念,并且對象是經由類創建出來的;還需要有封裝、繼承、多態三個特征(如:Java語言)。
??????????? JS語言不符合以上條件,但是有“對象”的概念,所以它是一門基于對象的編程語言。即JS不是一種面向對象的編程語言。
2、js和面向對象的關系:
??????????? 利用面向對象編程思想來指導js代碼的書寫方式。
?? 創建
?? 1>、字面量的方式(直接創建)
????????????? 語法:var對象名= {屬性名1:屬性值,
?????????????? 屬性名2:屬性值,
????????????? 方法名:匿名函數};
???????????? 例如:
???????????? 優勢:快捷、直觀、方便
???????????? 劣勢:需要創建多個對象時,代碼冗余
??? 2>、工廠模式(使用函數創建)
???????? 語法:
?????????????? function函數名(形參列表) {
???????????????????? var 對象名 = {};
???????????????????? 對象名.屬性名=參數1;
???????????????????? 對象名.屬性名=參數2;
????????????????????? 對象名.方法名=function (){
?????????????????????????? 操作;
??????????????????????? };
??????????????????? return? 對象名;
??????????????????? }
?? 例如:
??????? 優勢:解決了了代碼冗余的問題
? ? ? 劣勢:無法區分該對象的類型(如:系統類型,如number是Number()創建的,但是自定義類型無法獲取到,即? 無法利用instanceof判定對象的歸屬關系)
3>、使用構造函數(函數名首字母?寫)
??? 語法:
???? function? 構造函數名 (形參列表)? {
??????????? ? ?? this.屬性名 = 參數1;
??????? ? ?? ?? this.屬性名 = 參數2;
?????????? ? ?? this.方法名=function (){
???????????????? 操作;
?????????????? };
??????????? }
例如:
???? 優勢:解決了獲取對象類型的問題,使用構造函數創建的對象自帶一個constructor,通過該屬性獲取對象的類型(還可以使用instanceof檢測對象是那個類型,
???? 實例:(person?? instanceof???? Person) ,? 返回?個布爾值)。
???? 劣勢:內存占用有點大。
4>、工廠模式和構造函數創建對象的區別
???? 1、在函數中沒有顯式的創建新對象
???? 2、直接把屬性、方法賦值給了this指針
???? 3、沒有return語句
5>、使用構造函數創建出來的對象可以標識這個對象屬于哪一種類型。
6>、普通函數調用和構造函數調用的區別
???????? 必須使用new操作符來創建新對象,如果像調用普通函數那樣創建對象,
????????? 就是在全局作用域中調用函數了,this指針會指向window對象
訪問對象的屬性與方法
???? 訪問屬性
?1、點語法和[]訪問某?個屬性
???????? 1》使用點語法訪問屬性,點后直接跟屬性名;
???????? 2》使用[]訪問屬性,[]里是屬性字符串(必須是字符串類型的數據)或保存屬性名字符串的變量
例如:
2、使用for...in...遍歷對象的所有屬性(查詢)
3、刪除屬性
????????? 代碼:
????? 運行結果:
4、 訪問方法
??? 語法:對象名.方法名();
5、增加屬性:
附加:
???????????? 1、數組名:代表數組首元素的地址。