函式:prototype

Function 例項的 prototype 資料屬性是在使用 new 運算子將該函式作為建構函式呼叫時使用的。它將成為新物件的原型。

注意:並非所有 Function 物件都具有 prototype 屬性 — 請參閱 描述

一個物件。

Function: prototype 的屬性特性
可寫
可列舉
可配置

注意:是函式的一種,因此此處的大部分描述也適用於類的 prototype 屬性。唯一顯著的區別是類的 prototype 屬性是不可寫的。

描述

當使用 new 呼叫函式時,建構函式的 prototype 屬性將成為結果物件的原型。

js
function Ctor() {}
const inst = new Ctor();
console.log(Object.getPrototypeOf(inst) === Ctor.prototype); // true

有關建構函式 prototype 屬性與結果物件原型之間互動的更多資訊,您可以閱讀 繼承和原型鏈

一個函式擁有 prototype 屬性並不足以使其有資格成為建構函式。 生成器函式 具有 prototype 屬性,但不能使用 new 呼叫。

js
async function* asyncGeneratorFunction() {}
function* generatorFunction() {}

相反,生成器函式的 prototype 屬性在使用 new 呼叫它們時使用。prototype 屬性將成為返回的 Generator 物件原型的原型。

此外,某些函式可能具有 prototype,但在使用 new 呼叫時會無條件丟擲錯誤。例如,Symbol()BigInt() 函式在用 new 呼叫時會丟擲錯誤,因為 Symbol.prototypeBigInt.prototype 僅用於為原始值提供方法,但不應直接構造包裝器物件。

以下函式沒有 prototype,因此不具備建構函式的資格,即使後來手動分配了 prototype 屬性。

js
const method = { foo() {} }.foo;
const arrowFunction = () => {};
async function asyncFunction() {}

以下是擁有 prototype 的有效建構函式。

js
class Class {}
function fn() {}

一個 繫結函式 沒有 prototype 屬性,但可能是可構造的。當它被構造時,實際構造的是目標函式,如果目標函式是可構造的,它將返回一個普通例項。

js
const boundFunction = function () {}.bind(null);

函式建立的 prototype 屬性,預設情況下是一個普通物件,含有一個屬性:constructor,它指向函式本身。constructor 屬性是可寫的、不可列舉的、可配置的。

如果一個函式的 prototype 被重新賦值為非 Object 的內容,當該函式使用 new 呼叫時,返回物件的原型將是 Object.prototype。(換句話說,new 會忽略 prototype 屬性並構造一個普通物件。)

js
function Ctor() {}
Ctor.prototype = 3;
console.log(Object.getPrototypeOf(new Ctor()) === Object.prototype); // true

示例

透過修改 prototype 屬性來改變所有例項的原型

js
function Ctor() {}
const p1 = new Ctor();
const p2 = new Ctor();
Ctor.prototype.prop = 1;
console.log(p1.prop); // 1
console.log(p2.prop); // 1

向類的 prototype 屬性新增非方法屬性

類欄位為每個例項新增屬性。類方法在原型上宣告函式屬性。但是,沒有辦法向原型新增非函式屬性。如果您想在所有例項之間共享靜態資料(例如,所有錯誤例項的 Error.prototype.name 都相同),您可以手動將其分配到類的 prototype 上。

js
class Dog {
  constructor(name) {
    this.name = name;
  }
}

Dog.prototype.species = "dog";

console.log(new Dog("Jack").species); // "dog"

使用 靜態初始化塊可以使這一點更加符合人體工程學,這些塊在類初始化時被呼叫。

js
class Dog {
  static {
    Dog.prototype.species = "dog";
  }
  constructor(name) {
    this.name = name;
  }
}

console.log(new Dog("Jack").species); // "dog"

規範

規範
ECMAScript® 2026 語言規範
# sec-function-instances-prototype

另見