一:面向對象
1.面向對象基本特徵
封裝:也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏
繼承:通過繼承創建的新類稱為“子類”或“派生類”。繼承的過程,就是從一般到特殊的過程
多態:對象的多功能,多方法,一個方法多種表現形式
2.javascript和麪向對象
javascript是一種基於對象(object-based)的語言。但是,它又不是一種真正的面向對象編程(OOP)語言,因為它的語法中沒有class(類)—–Es6以前是這樣的。所以es5只有使用函數模擬的面向對象
二:javascript對象
在 JavaScript中,幾乎所有的事物都是對象
1.在JS中的對象定義
一個對象由多個成員組成,每個成員都有一對鍵值對,然後需要用逗號隔離成員
2.對象屬性
JavaScript 對象是屬性變量的容器。鍵值對通常寫法為 name : value (鍵與值以冒號分割)。鍵值對在 JavaScript 對象通常稱為 對象屬性
3.訪問對象屬性
(1)點表示法 eg:person.age;
(2)方括號表示法 eg:person["age"]
4.對象方法
對象的方法定義了一個函數,並作為對象的屬性存儲
對象方法通過添加 () 調用 (作為一個函數)
5.訪問對象方法
eg:
methodName : function() {
// 代碼
}
訪問:objectName.methodName()
6.Javascript中的"this"關鍵字
面嚮對象語言中 this 表示當前對象的一個引用
但在JavaScript中this不是固定不變的,它會隨着執行環境的改變而改變。
在方法中,this 表示該方法所屬的對象
如果單獨使用,this 表示全局對象
在函數中,this 表示全局對象
在函數中,在嚴格模式下,this 是未定義的(undefined)
在事件中,this 表示接收事件的元素
類似 call() 和 apply() 方法可以將 this 引用到任何對象
7.構造函數
(1)所謂“構造函數”,就是專門用來生成實例對象的函數。它就是對象的模板,描述實例對象的基本結構
一個構造函數,可以生成多個實例對象,這些實例對象都有相同的結構。都可以使用這個構造函數的屬性與方法
為了與普通函數區別,構造函數名字的第一個字母通常大寫
(2)特點
函數體內部使用了this關鍵字,代表了所要生成的對象實例
生成對象的時候,必須使用new命令
(3)構造函數的new關鍵字
new命令的作用,就是執行構造函數,返回一個實例對象
new 就是創造對象的過程
new 也叫做實例化對象的過程
new 創造出來的對象叫做構造函數的 實例對象
三:對象原型
1.js原型
JS的每個函數在創建的時候,都會生成一個屬性prototype,這個屬性指向一個對象,這個對象就是此函數的原型對象。該原型對象中有個屬性為constructor,指向該函數。這樣原型對象和它的函數之間就產生了聯繫
2.js原型鏈
(1)原型對象也會有它自己的原型,逐漸構成了原型鏈。原型鏈終止於擁有 null 作為其原型的對象上
(2)指向對象原型的屬性並不是 prototype。它的名字不是標準的,但實際上所有瀏覽器都使用 __proto__。訪問對象原型的標準方法是 Object.getPrototypeOf()
(3)當你試圖訪問一個對象的屬性時:如果在對象本身中找不到該屬性,就會在原型中搜索該屬性。如果仍然找不到該屬性,那麼就搜索原型的原型,以此類推,直到找到該屬性,或者到達鏈的末端,在這種情況下,返回 undefined
3.屬性遮蔽
當父子類定義了同名的熟悉給,並不是覆蓋了父類的屬性,是屬性遮蔽
4.設置原型
方法:
(1){}
(2)new Object()
(3)使用字面量
(4)工廠模式
(5)構造函數模式(constructor)
(6)原型模式(prototype)
(7)構造函數+原型模式
(8)Object.create()
5.自有屬性
(1)構造函數本身的屬性。通過對象的引用添加的屬性。其他對象可能無此屬性;即使有,也是彼此獨立的屬性
(2)使用hasOwnPropertype()方法檢測對象是否具有指定的自有屬性
6.原型屬性
(1)通過原型所定義的屬性。用於共享屬性和方法。從原型對象中繼承來的屬性,一旦原型對象中屬性值改變,所有繼承自該原型的對象屬性均改變
(2)使用in關鍵字檢測對象及其原型鏈中是否具有指定屬性
四:Javascript中的類
1.類
類是用於創建對象的模板,使用了class關鍵字來直接定義類,類本質上依然是構造函數
每個類中包含了一個特殊的方法 constructor(),它是類的構造函數,這種方法用於創建和初始化一個由 class 創建的對象
定義類:類聲明和類表達式
eg:
//1.類聲明
class Person{
constructor(){...}
}
//2.類表達式
var Animal = class{}
使用類:使用 new 關鍵字來創建對象,自動調用構造函數方法 constructor()
2.構造方法:
構造方法是一種特殊的方法:
構造方法名為 constructor()
構造方法在創建新對象時會自動執行
構造方法用於初始化對象屬性
如果不定義構造方法,JavaScript 會自動添加一個空的構造方法
3.嚴格模式 "use strict"
類聲明和類表達式的主體都執行在嚴格模式下。比如,構造函數,靜態方法,原型方法,getter 和 setter 都在嚴格模式下執行
4.繼承
使用extends關鍵字來聲明這個類繼承自另一個類
基於原型鏈的繼承
(1)JavaScript 對象是動態的屬性(指其自有屬性)“包”。JavaScript 對象有一個指向一個原型對象的鏈。當試圖訪問一個對象的屬性時,它不僅僅在該對象上搜尋,還會搜尋該對象的原型,以及原型的原型,依次層層向上搜索,直到找到一個名字匹配的屬性或到達原型鏈的末尾
(2)JavaScript 並沒有其他基於類的語言所定義的“方法”。在JavaScript 中,任何函數都被可以添加到對象上作為其屬性。函數的繼承與其他屬性的繼承沒有差別,包括上面的“屬性遮蔽”(這種情況相當於其他語言的方法重寫)
5.封裝
通過封裝,控制類的屬性與方法的可訪問信息
關鍵字:private、public、protected
封裝的三個好處: 程序低耦合、能夠對類的內部結構進行設置可訪問/不可訪問、能夠對內部成員進行限制
6.多態
成員方法的重載和重寫
(1)重載
方法重載是讓類以統一的方式處理不同類型數據的一種手段。多個同名函數同時存在,具有不同的參數個數/類型
重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數的區分標準
重載的規則:
1>必須具有不同的參數列表;
2>可以有不同的返回類型,只要參數列表不同就可以了;
3>可以有不同的訪問修飾符;
4>可以拋出不同的異常;
(2)重寫方法的規則:
1>參數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是重載
2>返回的類型必須一直與被重寫的方法的返回類型相同,否則不能稱其為重寫而是重載
3>訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
4>重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常