函数: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

另见