面向?qū)ο笳Z言舒萎,就是掌握‘類’程储,‘對象’蹭沛,‘實例’的相關(guān)知識以及他們間的關(guān)系。如‘類’的封裝章鲤、繼承和多態(tài)摊灭。
- 對象:萬物皆對象,各種事物都可成為我們的研究對象败徊。
- 類:對具有相同屬性的各對象的共同部分進(jìn)行分類帚呼、提取,封裝皱蹦。如‘人’這個類中煤杀,‘性別’就是人的屬性之一。
- 實例:從類中派生出來的就稱為實例沪哺。實例既有自己的私有屬性沈自,也有從類中繼承來的公有屬性。
js中類的封裝辜妓、繼承和多態(tài)
-
js中類的實現(xiàn)是通過原型和原型鏈實現(xiàn)的
1.1, 原型:每一個函數(shù)數(shù)據(jù)類型的值枯途,都含有prototype(原型)屬性(這個屬性是天生自帶的)。這個屬性值是一個對象籍滴,用來存儲實例的公用屬性和方法酪夷。
1.2, 在prototype這個屬性對象中,都包含一個constructor屬性(也是天生自帶)孽惰,這個屬性指向函數(shù)本身晚岭。(類似于C++中的構(gòu)造器)
1.3, 每一個對象數(shù)據(jù)類型的值,都含有私隱原型屬性'proto'灰瞻,該值指向?qū)ο笏鶎兕惖脑?prototype)
2.1, 原型鏈:每個對象都含有私隱原型proto腥例,并且指向所屬類的原型辅甥,所以每個對象都會通過原型這個屬性與上級連接酝润,我們就把這種通過原型屬性進(jìn)行連接的方式叫做原型鏈。
2.2, 原型鏈的查找機(jī)制:先在自己的私有屬性上查找璃弄,沒有找到就通過proto這個屬性向自己所屬類的原型prototype進(jìn)行查找要销,如果沒有再通過原型的proto繼續(xù)向上尋找,直到尋找到基類Object.prototype為止夏块。(Object為基類疏咐,所以它的proto為null)。
3.1, 這種原型鏈的查找機(jī)制也就是js中類的繼承和多態(tài)的實現(xiàn)機(jī)制脐供,如下:
例子1:function Person(name, age){ this.name = name this.age = age } Person.prototype.speak = function(){ console.log('i can speak chinese') } let p1 = new Person('小明'浑塞,18) p1.speak = function(){ console.log('i can speak english') } console.log(p1.speak()) // 'i can speak english' let p2 = new Person('小紅',22) console.log(p2.speak()) // 'i can speak chinese'
例子2:
原型鏈模式.png 通過hasOwnProperty可以檢查某個屬性是否為該對象的私有屬性
let ary = [1,2,3]
console.log(arr.hasOwnProperty('push')) // false 因為'push'是數(shù)組類(Array)的公有屬性政己,而非當(dāng)前實例'ary'的私有屬性
- 通過'in'可以檢查某個屬性是否為該對象具有的屬性(包含公有和私有屬性)
let ary = [1,2,3]
console.log('push' in ary) // true