JavaScript物件導向程式設計理解!

千鋒武漢發表於2021-03-31

      對程式設計有了解的同學都知道,物件導向是一個非常難以理解的概念。下面小千給大家分享一下物件object的理解,本篇文章主要分享面對物件的封裝。當然現實生活中物件導向也挺難的,哈哈哈~

      一,關於例項物件的原始模式

      首先我們知道每個物體都是一個物件,舉例來說,“狗”作為一個物件,他有“種類”和“顏色”兩個屬性。

1

      然後,我們需要建立兩個例項化物件

2

      這也是最基礎的物件封裝,也就是把“種類”和“顏色”兩個屬性放在一個物件裡面。但是問題來了,這種寫法有兩個問題:一是如果要生成很多個例項化物件,就需要重複很多遍,很麻煩;二是他們與原型Dog結構很相似,但是實際上沒有建立直接的聯絡。

      二,原始模式升級

      重複的程式碼,我們可以寫一個函式來解決

3

      接著再呼叫函式,生成例項化物件

4

      這種方法可以解決生成多個例項化物件程式碼複雜的問題,但是dog1和dog2之間沒有產生關聯,也就是依然沒有體現出他們其實是原型物件Dog的例項。

      三,建構函式

      為了解決讓例項化物件需要從原型物件生成的問題,js提供了建構函式這樣一個概念。當然其實建構函式本質上也就是一個普通函式,只不過函式內部使用了this,為了區分於普通函式,我們一般對建構函式首字母大寫,具體程式碼如下:

5

      有了這個建構函式,我們就可以生成例項化物件了,具體程式碼如下:

6

      這裡我們可以看到關鍵字new , 也就是實際上Dog是一個物件,dog1和dog2是Dog這個物件的例項化物件;為了驗證這一點,js提供了一個屬性constructor,此屬性用於指向他們的建構函式

7

      當然,js還有另一個運算子 instanceof,可以驗證原型物件與例項化物件之間的關係。

8

      到建構函式這裡看似已經很完美了,但是,這裡存在一個很大的弊端,也就是記憶體浪費。舉例來說,我們現在給Dog物件新增一個不變的屬性和方法如下:

9

      當然這裡生成例項化方法也還是一樣的,但是這裡會有一個很大的問題:也就是我們會發現age屬性和eat()方法明明是一模一樣的內容,但是由於每次生成例項化物件時,都會生成同樣的內容,多造成記憶體浪費。

console.log(dog1.eat == dog2.eat); // false

      如果能讓age和eat()在記憶體中只生成一次,讓例項化物件指向同一個記憶體地址就更完美了。

      四,prototype模式

      js為每一個建構函式都提供了一個prototype屬性,讓他指向另一個物件,而這個物件的所有屬性和方法都會被建構函式的例項物件繼承。這也就意味著,只要我們把那些不變的屬性和方法定義在prototype物件上即可。

10

      接著再生成例項,此時,所有例項的age個eat()方法都會指向同一個記憶體地址,也就是prototype物件,這樣也就避免了記憶體浪費問題,從而提供執行效率。

console.log(dog1.eat == dog2.eat); // true

      當然為了驗證這一問題,js定義了一些輔助屬性。

      1. isPrototypeOf() , 此方法用於驗證prototype物件和例項化物件之間的關聯

console.log(Dog.prototype.isPrototypeOf(dog1)); // true
console.log(Dog.prototype.isPrototypeOf(dog2)); // true

      2. HasOwnProperty() , 每個例項化物件都有此方法,顧名思義,這個方法是用於驗證屬性是自有的還是繼承自prototype物件的 ; 這裡很顯然type是自有屬性,而age是繼承自prototype物件。

console.log(dog1.hasOwnProperty('type')) // true
console.log(dog1.hasOwnProperty('age')) // false


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2765846/,如需轉載,請註明出處,否則將追究法律責任。

相關文章