物件導向程式設計

2022-08-26 23:21:26 字數 4170 閱讀 1328

這是一篇簡單介紹js物件導向的程式設計筆記

一,js解析和執行

js解析時,會先把var和function宣告的變數和函式放到乙個詞法物件裡,變數的值是undefined,函式則是乙個引用,這是js變數提公升的根本機制。

如果乙個變數沒有宣告就開始使用了,不論它是在區域性還是全域性使用,它都是掛在了window下,是個全域性變數,這點和this指向很類似,this找不到直接呼叫者,也是直接指向window。

如果變數名和函式名命名衝突了,則該命名最後指向的是函式。如果兩個函式名重複了,則後面乙個函式覆蓋前面的,因為在js中,函式才是第一等公民。

e.g. 

console.log(a)

//undefined

var a = 1console.log(a)//1

e.g.

console.log(aa)

//function aa()

var aa = 1

function

aa()

function

aa()

二,作用域

js只有全域性作用域和區域性(函式)作用域,並且內部可以由內到外,從近到遠,訪問即止地層層訪問外部變數,形成一條作用域鏈,而外部不能直接訪問內部變數。

e.g.

var a = 1

var b = function

() b()//3

console.log(c)//

undefined

三,閉包

一種訪問區域性變數的手段,通常指的是乙個可以訪問區域性變數的函式。

閉包乙個是前面提到的可以讀取函式內部的變數,另乙個就是讓這些變數的值始終保持在記憶體中,因此要注意控制效能,提高網頁效能。

e.g.

var name = "the window";

var object =;}};

//執行了object.getnamefunc()返回的函式,此時this找不到直接呼叫者,直接指向window

alert(object.getnamefunc()());

e.g.

var name = "the window";

var object =;}};

//執行了object.getnamefunc()返回的函式,此時this固定化成了object,彈出object.name

alert(object.getnamefunc()());

四,類與物件

搞清楚js中的類,就需要明白三個概念:建構函式、原型物件,例項化和例項。

e.g.

function

person(name,age)

person.prototype.hello = function

()

var xm = new person('xiaoming',12)

xm.hello()

//hello,i am xiaoming,and i am 12

person.prototype =

var xmm = new person('xiaomingming',34)

console.log(xm.asset)

//undefined

console.log(xmm.asset)//

12345

其中person函式就是建構函式,person.prototype指向的物件就是原型物件,xm就是例項

1,乙個新物件被建立了,繼承person.prototype原型物件裡的屬性。

2,使用指定的引數呼叫建構函式person,並將this指向新建立的物件。

如果我們用自定義函式模擬過程,則:

e.g.

function

person(name,age)

function

new(f)

return

o }

}var xmmm = new(person)('xmmm',232)

在js中,並沒有真正的類的概念,只是用建構函式和原型物件模擬了類,其中原型物件是類的唯一標識,當且僅當兩個物件繼承自同乙個原型物件的時候,我們才說它們是同乙個類的例項。而初始化物件的建構函式則不能作為類的標識,通常建構函式的名字被用來當做類名了而已。

instanceof 運算子

例項 instanceof 類名 被用來判斷乙個例項是否繼承自某個原型物件,返回布林值。

在上述例子中,原型物件也是物件,也具有原型物件,即原型物件的原型物件,以此類推。訪問乙個例項本身沒有的屬性或方法時,js會從原型物件上去找,原型物件上沒有時,會從原型物件上的原型物件上去找,......這種像鏈式一樣地繼承機制就是原型鏈,和作用域鏈很類似。

原型物件中constructor屬性則是指向該原型物件的建構函式,在修改原型物件時,比如增刪其屬性時,可採用.符號操作,如person.prototype.hello = s =>,在例項person初始化的時候,該原型物件的constructor預設指向建構函式.

但是如果直接給person.prototype賦值物件型資料時,則需要顯式指定constructor屬性,否則原有的原型物件會被新物件所替代,而通過建構函式例項化的例項的__protoo__屬性都會指向最新的person.prototype物件。在這個改動之後例項化的例項均不能繼承原有的原型物件的屬性,改動之前的例項亦不能繼承新原型物件的屬性。

例項,建構函式,原型物件,原型鏈之間的關係可以借助一張神圖來說明關係

this指標問題:

1,總是指向方法的直接呼叫物件,在事件觸發中指向觸發該事件的dom節點物件

2,指向new出來的例項

五,封裝

一段**能夠實現某種功能,隱藏該**的細節,僅對外開放介面去使用該功能**,即是對該功能**的封裝。

六,繼承

繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。具有的方式可能是複製,可能是引用。

從物件層面上來看繼承:

1,複製

var zsh =

var job =

for (var key in

job)

console.log(zsh)

//

涉及到深淺複製參考:

2,object.create(proto[, propertiesobject])

es5裡的方法,注意相容性。

引數proto 新建立物件的原型物件。

propertiesobject 可選。如果沒有指定為 undefined,則是要新增到新建立物件的可列舉屬性(即其自身定義的屬性,而不是其原型鏈上的列舉屬性)物件的屬性描述符以及相應的屬性名稱。這些屬性對應object.defineproperties()的第二個引數。

返回值在指定原型物件上新增新屬性後的物件。

從類的層面上來看繼承:

//

建立父類

//建立子類

//建立聯絡,修正建構函式

//例項化

function

father() {}

function

son() {}

son.prototype =object.create(father.prototype)

//此時,son.prototype.constructor指向的是function father() {},我們最好是將其修正過來

son.prototype.constructor = son

七,多型

'見人說人話,見鬼說鬼話。'

根據不同的引數個數,呼叫不同的方法,實現不同的功能

本質上是檢測arguments中資料型別來做對應的操作,將差異化的處理方式通用封裝處理。

e.g.

function

duotai(a,b,c,d,e,f)

duotai(1,2,3,4)//

6 4e.g.

function

add()

return

result

}add(1,2,3,4,6,7,8)//

31 add(343,567,8456,234)//

9600

c 物件導向程式設計 物件導向

什麼是物件導向 是對現實世界理解和抽象的方法。物件導向程式設計的特點 易維護,易擴充套件,靈活性好,重用 類 對事物的抽象定義,即事物具有的共同特徵和行為。物件 即對類進行例項 類是抽象的,物件是具體的 類的定義 語法 訪問修飾符 class 類名類的成員 包括字段,屬性,方法,常量,事件和索引器等...

物件導向程式設計

物件導向程式設計 抽象 封裝 繼承 多型 單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因。開放封閉原則 軟體實體應該可以擴充套件,但是不可修改。所有的設計模式都是對不同的可變性進行封裝,從而使系統在不同的角度上達到開發封閉原則。依賴倒轉原則 a 高層不應該依賴低層,兩個都應該依賴抽象。b ...

物件導向程式設計

class team def init self self.name tampa bay buccaneers bucs team print bucs.name tampa bay buccaneers 當呼叫team 函式時,會自動呼叫init函式,self是自動傳入到init中的引數,它指向當...