JavaScript原型繼承添加方法屬性

在javascript中,一個函數,能夠包含變量,也能夠包含其它的函數,那麼,這樣子的話,咱們就能夠把變量作爲類的屬性,內部的函數則做爲成員方法了。那麼,外層的函數,就能夠當作是一個類了。javascript

一、首先咱們寫一個動物類吧,其實他是一個函數,只不過咱們能夠把它當作這個類的構造函數java

  1. function Animal(){  
  2.      console.log('Call the constuctor.');  
  3.  } 

二、而後咱們能夠使用new關鍵字來建立一個myClass類的實例函數

  1. var cat = new Animal(); 

這樣,咱們就建立了一個實例obj了,運行一下,使用相關的調試工具就能夠看到Call the constructor的調試信息了。也就證實,咱們建立類成功了。工具

三、那麼,接下來,咱們也能夠給構造函數加上參數,好比:this

  1. function Animal(name){  
  2.     this.name = name;  

這樣子,咱們就能夠建立實例,而且訪問類的屬性了spa

  1. function myClass(name){  
  2.     this.name = name;  
  3. }  
  4. var cat = new myClass("Kate");  
  5. alert(cat.name); 

這樣子,就能夠訪問到實例cat的屬性name了。prototype

四、你們都知道,動物會跳會吃,那麼咱們怎麼給他加上方法呢?看下面調試

方法一:直接在構造函數裏面聲明方法對象

  1. function Animal(name){  
  2.     this.name = name;  
  3.     this.jump = function(){  
  4.         alert (this.name + " is jumping...");  
  5.     };  
  6.  
  7.     this.eat = function(){  
  8.         alert (this.name + " is eatting...");  
  9.     };  
  10. }  
  11.  
  12. var cat = new Animal("Kate");  
  13.  
  14. alert(cat.name);  
  15. cat.jump();  
  16. cat.eat(); 

方法二:利用prototype爲類添加方法繼承

  1. function Animal(name){  
  2.     this.name = name;  
  3. }  
  4.  
  5. Animal.prototype = {  
  6.           
  7.     type : 'cat',  
  8.  
  9.     jump : function(){  
  10.         alert (this.name + " is jumping...");  
  11.     },  
  12.  
  13.     eat : function(){  
  14.         alert (this.name + " is eatting...");              
  15.     }  
  16.  
  17. }  
  18.  
  19. var cat = new Animal("Kate");  
  20.  
  21. alert(cat.name);  
  22. alert(cat.type);  
  23. cat.jump();  
  24. cat.eat(); 

一樣的,咱們也能夠用一樣的方法爲類添加新的屬性,如type....

五、上面咱們講到的,是javascipt中,怎麼建立一個類,以及怎麼爲類添加屬性以及方法,接下來,咱們談一下怎麼實現類的繼承。

要實現繼承,咱們能夠經過prototype實現類的繼承,首先,咱們要先聲明一個Dog類(若是還不懂,請從新看上面相關內容),而且讓它繼承Animal類。

  1. function Dog(){};  
  2. Dog.prototype = new Animal("Henry"); 

而後咱們能夠實例化一隻新的狗dog出來,試着調用它的方法,看當作功了嗎?

  1. function Dog(){};  
  2. Dog.prototype = new Animal("Henry");  
  3.  
  4. var dog = new Dog();  
  5. dog.jump();  
  6. dog.eat(); 

顯然,若是代碼沒敲錯的話,應該能夠看到提示「Henry is jumping...」,「Henry is eatting...」。

六、既然實現了類的繼承,那就必然想到另一個問題,那就是多態的問題。

多態是指相同的操做或函數、過程可做用於多種類型的對象上並得到不一樣的結果。不一樣的對象,收到同一消息能夠產生不一樣的結果,這種現象稱爲多態。

經過繼承,子類已經繼承了父類的方法了,但要實現多態,勢必對子類的方法進行重寫。

爲了表達更明確,咱們再建立一個Pig類出來,而且繼承Animal類。怎麼建立我就不說了。建立完的代碼應該是像如今這樣子。

  1. function Dog(){};  
  2. Dog.prototype = new Animal("Henry");  
  3.  
  4. function Pig(){};  
  5. Pig.prototype = new Animal("Coco");  
  6.  
  7. var dog = new Dog();  
  8. dog.jump();  
  9. dog.eat();  
  10.  
  11. var pig = new Pig();  
  12.  
  13. pig.jump();  
  14. pig.eat(); 

運行以後,由於繼承了Animal類的緣由,結果確定又是「XX is jumping...」,「XX is eatting...」了,那咱們要實現的,就是進行方法的重寫。咱們能夠有下面的方式實現方法的重寫。

  1. function Dog(){};//建立dog子類  
  2. Dog.prototype = new Animal("Henry");  
  3. //重寫dog的方法  
  4. Dog.prototype.jump = function(){  
  5.     alert("Hi, this is " + this.name + ", I'm jumping...")  
  6. };  
  7. Dog.prototype.eat = function(){  
  8.     alert("Henry is eatting a bone now.");      
  9. };  
  10.  
  11. function Pig(){};//建立pig子類  
  12. Pig.prototype = new Animal("Coco");  
  13. //重寫pig的方法  
  14. Pig.prototype.jump = function(){  
  15.     alert("I'm sorry. " + this.name + " can not jump.");  
  16. };  
  17. Pig.prototype.eat = function(){  
  18.     alert("Hi, I'm " + this.name + ", I'm eatting something delicious.");  
  19. }  
  20.  
  21. var dog = new Dog();  
  22. dog.jump();  
  23. dog.eat();  
  24.  
  25. var pig = new Pig();  
  26.  
  27. pig.jump();  
  28. pig.eat(); 

運行一下,是否是實現了對方法的重寫呢??

六、那麼,假如我實例化一隻dog以後,我想單獨爲這隻dog添加屬性和方法,怎麼作呢?看下面

  1. var dog = new Dog();  
  2. //添加屬性和方法  
  3. dog.type = "Doberman Pinscher";  
  4. dog.shout = function(){  
  5.     alert("I'm a " + this.type + ".");  
  6. }  
  7. dog.jump();  
  8. dog.eat();  
  9. //調用新的方法  
  10. dog.shout(); 
相關文章
相關標籤/搜索