本周學習了JS高級,比起之前學習的html 、css、JS基礎,JS高級還是比較難接受一點的,特意利用周末的閑暇,來總結一下本周學習的內容。老師說總結有利于對學習知識的鞏固。特寫此總結來增加自己對所學知識的了解,掌握。
面向對象入門:
什么事面向對象:
面向對象就是把構成事物問題分解成各個對象,建立對象的目的不是為了完成事物中的一個步驟,而是為了描述解決事物問題的步驟中的行為。
1、面向對象是一種思維方法。
2、面向對象是一種編程方法。
3、面向對象并不只是針對某一種編程語言
面向對象和面向過程的區別:
面向過程側重于問題解決步驟,側重于局部。
面向對象側重解決某一問題的功能。側重于整體。
編程語言中面向對象的實現方式:
1、基于類的面向對象----典型語言:java、C#
2、基于原型的面向對象----典型語言:JavaScript
但是無論以何種方式實現,都具有是哪個特征:封裝、繼承、多態。
對象的一些認知:
對象就是無序屬性的集合,可以包括基本值,對象或函數。
用大括號括起來的一系列鍵值對,就構成一個JavaScript對象,這種創建對象的方式稱之為字面量創建對象。請看下列代碼:
其中name , age , sex , eat.都是對象person的屬性,屬性可以是任何類型的。可以是簡單數據類型,也可以是函數,也可以是對象。當一個屬性是一個函數時。我們稱為這個對象的方法。
訪問對象的屬性:
訪問對象的屬性有兩種方法。
1.對象.屬性名。比如訪問上面代碼里對象的屬性:person.name; 如果屬性名是個變量,那么這種訪問方式會失效。并報錯。
2.對象[屬性名]。比如訪問上面代碼里對象的屬性:person [" age ]" ?。如果屬性名是個變量,那么訪問可以直接訪問,不需要加引號。
給對象添加屬性:
person.hobbies = " 籃球"。 person.age = 40。 ?給對象添加屬性時會先判斷該對象里有沒有該屬性。如果有,就是更改對象的屬性值,如果沒有,則給該對象添加這個屬性。
刪除對象的屬性:
刪除對象的屬性需要用 delete 操作符。如:delete ?person.name ? 這樣為刪除對象的name屬性。
遍歷對象的屬性:
遍歷對象屬性用 for。。in。。 ?如: for( pn ?in ?person) { ? ? } ? ?其中pn為對象的屬性的名稱。
構造函數創建對象:
看下面代碼:
使用構造函數創建對象,必須使用 new 關鍵字,后面跟著 構造函數的名,根據需要傳入參數。將構造函數的作用域傳遞給新對象,其中的 this ?表示 誰調用 this 就指向誰。如 上面代碼 this 就指向 p1。
原型理解:
函數的原型對象:申明一個函數a,瀏覽器就會自動創建一個對象b。并且函數a里會有一個默認屬性:prototype , 指向對象b。這個對象b就是函數a的原型對象。a.prototype = = b 。 并且對象b里也有一個默認屬性 constructor ,指向函數a。 b . constructor == a 。?
使用構造函數創建對象:當我們把一個函數作為構造函數來 new 一個對象的時候。那么這個對象里會有一個默認的不可見的屬性:[[ proto ]] .這個屬性就指向 者個構造函數的原型。如下:p1.__proto__ == person.prototype .
請看下面代碼:
關于原型的方法:hasOwnProperty() ?方法,判斷一個屬性是否來自對象本身。但是不能判斷這個屬性是否存在。因為可能存在于原型中。
in操作符: 用來判斷一個屬性是否存在于對象中,先會在對象本身查找,如果找不到就去原型中查找,如果存在者個屬性,就返回true。
由上面可以知道判斷 一個對象的屬性是否存在于原型中。看下面代碼:
組合使用原型模式和構造函數模式創建對象:
原型創建對象的特點:屬性共享(缺點)? 方法共享(優點)
構造函數創建對象的特點:屬性不共享(優點)? 方法不共享(缺點)
組合模式創建對象:? 綜合兩種模式的優點,在構造函數內部封裝屬性,在原型對象內封裝方法。缺點:封裝不徹底。看下面代碼:
動態原型模式創建對象:把所有的屬性和方法都封裝在構造方法中,在需要的時候再去初始化原型。推薦使用,因為解決了封裝不徹底問題。看下面代碼:
JavaScript的繼承:
繼承:繼承是在原型鏈的基礎上實現的。指定對象的原型對象為某一個自定義對象其實就完成了繼承。
原型鏈:
構造函數的 prototype 屬性指向原型對象,原型對象的 constructor 屬性指向構造函數,new構造函數的 [[proto]]? 屬性指向構造函數的原型。尋找對象的屬性或方法先在自身查找,在去原型中查找,找不到再去原型的原型中查找。。。直到最高級的原型。就是根據原型鏈查找。
默認頂端原型:Object構造函數的原型對象。我們隨意創建一個對象,就有很多方法可以調用,就是繼承來自Object的原型對象的方法如圖:
更改對象的原型:請看代碼:
上面的代碼其實就完成了Son繼承Father的過程。
繼承的缺陷:父元素屬性共享。看下面代碼:
解決方式:借用構造函數調用繼承:只是完成構造方法的調用,并沒有繼承。call(參數1,。。。) 接受的是一個一個的參數? ? 參數1:要執行的方法中的this的指向。? 其他參數: 函數的所有參數。apply() 接受的是數組。看下面代碼:組合繼承:
測試數據類型的方法:
typeof: 測試對象,一般返回 Object ,用處不大。
instanceof? ? 測試一個對象是不是某種類型,返回 boolean 值。
isPrototypeOf(對象)? 原型對象的方法,判斷參數對象是不是由這個原型派生出來的。
this指向總結:
在JavaScript中,this的指向是動態改變( 運行時綁定 )的,不同的調用方式,ths的指向是不同的。
1.調用一個方法或者函數的時候,如果是直接調用方法名()則這函數或方法中的this指代的就是window
2.調用一個方法或者函數的時候,使用的是對象.方法名()則這個函數或方法中的this指代的就是這個對象
3.當做構造方法來用,使用new的時候,則this指代的是將要創建的對象
4.使用call或applay改變this的指向