javaScript面向對象是什么?(一)


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 }

那么上一個知識點的那兩個問題可就都解決了哦~~~

這樣也就發展出一個廣泛的一個寫法了哦

用構造函數去寫自有屬性和方法,用原型去寫共有的屬性和方法,這種方式叫混合方式

 

那么面向對象說完沒?沒有,下節再看吧。我吃飯去了。。。。。。。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM