js就是個面向對象語言,一切皆對象
一、什么是面向對象?
簡單點,就這么說吧。生活中有一些個物品,譬如(哈哈,還想起個譬如)說一個iPhone,我們也不知道里面的工作原理吧?但是咱們會按按鈕呀,用一倆天就會用了, oh my god,不知道原理就會用,好厲害。
那么javaScrip中的自帶方法Date對象都知道吧, 這兄弟有個兒子(閨女也行,你說什么就是什么)getMonth的方法,那你知道它是怎么知道現在是哪個月嗎?不知道。管他呢,但是me會用
其實呢,我們不需要知道原理就可以用它的功能,就是面向對象。
其實對象就是一個整體,對外提供一些功能和操作,而你不知道它內部是怎么操作的。在編程中我們叫面向對象,在生活中也有,但是叫法不一樣
在編程中,就像jQuery,你知道它的$('div') 怎么獲取到的DOM對象嗎,不知道。(‘’我知道‘’,‘去一邊去,你是看了源碼。你拆機了,你能不知道?’)只要知道它干嘛的就行,那他是不是面向對象編程的呢?
二、面向對象特點
1、抽象:抽指把核心的東西抽出來,把與我們要解決的問題有關的東西拿出來擺在面前
2、封裝:讓使用對象的人不考慮內部實現,只考慮功能使用 把內部的代碼保護起來,只留出一些個api接口供用戶使用
3、繼承:就是為了代碼的復用,從父類上繼承出一些方法和屬性,子類也有自己的一些屬性
4、多態:實際上是不同對象作用與同一操作產生不同的效果。多態的思想實際上是把“想做什么”和“誰去做“分開
三、對象的組成
1、方法 函數:過程、動態的
2、屬性 變量:狀態、靜態的
四、this 當前的方法屬於誰就是誰
例如點擊事件里的this,其實就是觸發事件的那個dom對象的onclick方法里的this,當然是人家自己咯
再比如說一個函數里的this,這個函數都屬於window的一個方法,當然里面的this也是window咯
還有哦,不要在系統對象上面添加屬性和方法,這樣不太好
那么在誰身上加呢?在object這個對象身上,別的date呀array呀,這些對象都是有一些個好玩的功能的,
object也就自己最強大的一個功能就是,沒有功能~~~~ 這樣咱們就可以隨意給他加屬性和方法而不用去想會不會覆蓋了
五、創建對象的方法
1、最基礎的
1 var obj = new Object() 2 obj.name = 'shizhikai' 3 obj.age = '3歲' 4 obj.showAge = function(){ 5 console.log(this.age) //這個this是誰?知道嗎? obj 6 }
但是這樣太麻煩,我要寫100個人,那得寫100次。有別的方法嗎?有
2、工廠方式 通過構造函數
function createPerson(name,age){ // 原料 var obj=new Object(); // 加工 obj.name=name; obj.age=age; obj.showAge=function() { alert(this.age) } // 出廠 return obj; } var obj1=createPerson("shizhikai",'3歲') var obj2=createPerson("ni",'18歲'); alert(obj1.showName)//function(){alert(this.name)} alert(obj2.showName)//function(){alert(this.name)}
結果都一樣但是比較一下:
1 console.log(obj1.showName==obj2.showName) //false
這里居然是不一樣!!這樣的話那我一百個對象就有一百個不一樣的方法要占用內充~~~~
也就說會有兩種問題:1. 創建對象沒有用到new 感覺心里空落落的 2. 方法都不一樣的話太占據空間了~~~~
那就去解決
1 function createPerson(name,age){ 2 // 原料 系統偷偷摸摸做的 3 // var this=new Object(); 4 // 加工 5 this.name=name; 6 this.age=age; 7 this.showName=function() { 8 alert(this.name) 9 } 10 // 出廠 系統偷偷摸摸做的 11 // return this; 12 } 13 14 var obj1=new createPerson("shizhikai",'3歲') 15 var obj2=new createPerson("ni",'18歲');
這樣的話代碼又少了很多,很爽,而且還有new了,其實就是利用了一個概念,任何函數都可以new一下
譬如
function aa(){} console.log(new aa()) //Object
那它就變成對象啦,那它里面的this就是它new出來的自己啦~~~~
但是這樣還是有一個問題,
console.log(obj1.showName==obj2.showName) //false
還要占內存
那繼續解決
這里就要用到面向對象中不得不說的,而且很重要的的東西.prototype 原型~~~
六、.prototype
先來看個例子,比如說有兩個熊,熊大、熊二去偷了同一顆蘋果樹上的蜂蜜窩,熊大偷了后又拿了個蘋果,熊二看見熊大有蘋果就不干了,去找蘋果樹的理論,為什么他
有我沒有,這就不講道理了吧,畢竟熊大那個蘋果是自己順便拿的,熊二當然沒有了,但是如果說蜂蜜窩就在蘋果上面築的巢話,這樣熊大就不用去拿蘋果了,直接全窩端,哈哈哈。倆只熊都有了呢,皆大歡喜。
1 var xiong1=[1,2,3]; 2 var xiong2=[4,5,6];
3 xiong1.sum=function(){
4 var result=0; 5 for(var i=0;i<this.length;i++){ 6 result+=this[i] 7 } 8 return result; 9 } 10 alert(xiong1.sum()) //6
11 alert(xiong2.sum()) //error
就像這個例子,xiong2根本沒有這個方法嘛,想要的話,只能自己去添加咯,再寫一遍
1 xiong2.sum=function(){ 2 var result=0; 3 for(var i=0;i<this.length;i++){ 4 result+=this[i] 5 } 6 return result; 7 }
這樣還是麻煩,占內存
1 var xiong1=[1,2,3]; 2 var xiong2=[4,5,6]; 3 Array.prototype.sum=function(){ 4 var result=0; 5 for(var i=0;i<this.length;i++){ 6 result+=this[i] 7 } 8 return result; 9 } 10 11 alert(xiong1.sum()) //6 12 alert(xiong2.sum()) //15 13 14 15 function createPerson(name,age){ 16 this.name=name; 17 this.age=age; 18 } 19 createPerson.prototype.showAge=function(){ 20 this.showAge=function() { 21 console.log(this.age) 22 } 23 }
那么上一個知識點的那兩個問題可就都解決了哦~~~
這樣也就發展出一個廣泛的一個寫法了哦
用構造函數去寫自有屬性和方法,用原型去寫共有的屬性和方法,這種方式叫混合方式
那么面向對象說完沒?沒有,下節再看吧。我吃飯去了。。。。。。。。。。