JS----構造函數與原型prototype 區別


構造函數方法很好用,但是存在一個浪費內存

通過原型法分配的函數是所有對象共享的.
通過原型法分配的屬性是獨立.-----如果你不修改屬性,他們是共享

 如果我們希望所有的對象使用同一一個函數,最好使用原型法添加函數,這樣比較節省內存.


例子:

//----構造函數模式
為Cat對象添加一個不變的屬性"type"(種類),再添加一個方法eat(吃老鼠)。那么,原型對象Cat就變成了下面這樣:

 

[javascript]  view plain  copy
 
 print?
  1. <script>  
  2. function Cat(name, color) {  
  3.     this.name = name;  
  4.     this.color = color;  
  5.     this.type = "貓科動物";  
  6.     this.eat = function () {  
  7.         alert("吃老鼠");  
  8.     };  
  9.     }  
  10.   
  11.   
  12. //生成實例:  
  13. var cat1 = new Cat("大毛", "黃色");  
  14. var cat2 = new Cat("二毛", "黑色");  
  15. alert(cat1.type);         // 貓科動物  
  16. cat1.eat();       // 吃老鼠   
  17.   
  18.   
  19. alert(cat1.eat == cat2.eat); //false  
  20. </script>  

那就是對於每一個實例對象,type屬性和eat()方法都是一模一樣的內容,每一次生成一個實例,都必須為重復的內容,多占用一些內存。這樣既不環保,也缺乏效率。
  

 

//----Prototype模式 
Javascript規定,每一個構造函數都有一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的實例繼承。
這意味着,我們可以把那些不變的屬性和方法,直接定義在prototype對象上。

[javascript]  view plain  copy
 
 print?
  1. <script>  
  2. function Cat(name, color) {  
  3.     this.name = name;  
  4.     this.color = color;  
  5.     }  
  6.   
  7.   
  8. Cat.prototype.type = "貓科動物";  
  9. Cat.prototype.eat = function () {  
  10.     alert("吃老鼠")  
  11. };  
  12.   
  13.   
  14. //生成實例。  
  15. var cat1 = new Cat("大毛", "黃色");  
  16. var cat2 = new Cat("二毛", "黑色");  
  17. alert(cat1.type); // 貓科動物  
  18. cat1.eat();// 吃老鼠  
  19.   
  20.   
  21. alert(cat1.eat == cat2.eat);//trueF  
  22. </script>  

這時所有實例的type屬性和eat()方法,其實都是一個內存地址,指向prototype對象,因此就提高了運行效率。


免責聲明!

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



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