建構函式方法很好用,但是存在一個浪費記憶體

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

如果我們希望所有的物件使用同一一個函式,最好使用原型法新增函式,這樣比較節省記憶體.

例子:

//----建構函式模式
為Cat物件新增一個不變的屬性"type"(種類),再新增一個方法eat(吃老鼠)。那麼,原型物件Cat就變成了下面這樣:

  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. var cat1 = new Cat("大毛", "黃色");
  12. var cat2 = new Cat("二毛", "黑色");
  13. alert(cat1.type);         // 貓科動物
  14. cat1.eat();       // 吃老鼠
  15. alert(cat1.eat == cat2.eat); //false
  16. </script>

那就是對於每一個例項物件,type屬性和eat()方法都是一模一樣的內容,每一次生成一個例項,都必須為重複的內容,多佔用一些記憶體。這樣既不環保,也缺乏效率。
  

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

  1. <script>
  2. function Cat(name, color) {
  3. this.name = name;
  4. this.color = color;
  5. }
  6. Cat.prototype.type = "貓科動物";
  7. Cat.prototype.eat = function () {
  8. alert("吃老鼠")
  9. };
  10. //生成例項。
  11. var cat1 = new Cat("大毛", "黃色");
  12. var cat2 = new Cat("二毛", "黑色");
  13. alert(cat1.type); // 貓科動物
  14. cat1.eat();// 吃老鼠
  15. alert(cat1.eat == cat2.eat);//trueF
  16. </script>

這時所有例項的type屬性和eat()方法,其實都是一個記憶體地址,指向prototype物件,因此就提高了執行效率。