iT邦幫忙

0

JavaScript 的prototype

  • 分享至 

  • xImage
  •  

在 JavaScript 中,prototype 適合用於 需要創建多個具有相同功能的對象 的情況,特別是在需要共享方法或屬性時。這樣可以避免每次創建新對象時都重複定義相同的功能,從而節省記憶體。

Prototype 的適用情況:

  1. 定義對象的共享方法或屬性:當需要多個實例共享某些方法或屬性時,可以將這些方法定義在原型上。
  2. 需要提高效能:通過將方法或屬性放在原型上,每個實例都能訪問它們,而不需要在每個實例中複製一份。
  3. 需要擴展內建對象:可以使用 prototype 來擴展如 Array 或 String 等內建對象的功能(雖然這需要謹慎使用,以免影響全域行為)。

範例:使用 Prototype 實現共享方法

以下是一個定義建構函式並使用 prototype 添加共享方法的例子:

// 定義一個建構函式
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 將共享方法添加到原型
Person.prototype.greet = function () {
  console.log(`Hi, my name is ${this.name} and I am ${this.age} years old.`);
};

// 創建多個實例
const person1 = new Person("Alice", 25);
const person2 = new Person("Bob", 30);

// 調用共享方法
person1.greet(); // Hi, my name is Alice and I am 25 years old.
person2.greet(); // Hi, my name is Bob and I am 30 years old.

// 確認方法是否共享
console.log(person1.greet === person2.greet); // true

為什麼用 prototype?

  1. 共享方法節省內存:在這裡,greet 方法只存在於 Person.prototype 中,而不是每個實例中都拷貝一份。
  2. 便於擴展:如果需要為所有實例新增方法,可以直接修改原型,而不需要逐一修改實例。

什麼情況不用 prototype?

如果每個對象需要獨立的方法或屬性(比如需要每個對象有自己獨立的數據),那麼應該直接在建構函式中定義,而不是放在原型上。

例如:

function Animal(type) {
  this.type = type;
  this.getType = function () {
    return this.type;
  };
}

const cat = new Animal("Cat");
const dog = new Animal("Dog");

console.log(cat.getType === dog.getType); // false (每個實例都有自己獨立的 getType 方法)

這樣的設計會導致每個實例的方法佔用更多內存,因此應根據需求決定是否使用 prototype。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言