Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. JavaScript 标准内置对象
  5. Function
  6. Function.prototype.prototype

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

Function.prototype.prototype

Function 实例作为构造函数与new 运算符一起使用时,该实例的prototype 数据属性将用作新对象的原型。

备注:并不是所有的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 属性的函数也并不代表其有资格作为构造函数。例如,function* 拥有prototype 属性,但它不能通过new 运算符来调用。

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

反之,生成器函数通常在它们不被new 运算符调用的时候被用到它们的prototype 属性。prototype 属性会作为返回的Generator 对象的原型。

另外,一些函数也可能在通过new 运算符调用的情况下无条件抛出,即便它们可能具有prototype。例如,Symbol()BigInt() 函数会在它们通过new 运算符来调用时抛出,因为Symbol.prototype andBigInt.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

示例

通过修改原型的属性来修改所有实例的原型

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

将非函数属性添加到类的原型中

公有类字段会为每一个实例都添加属性。类方法可以在原型中定义函数属性。但是,无法将非函数属性添加到原型中。假如你希望在所有实例之间共享静态数据(例如,Error.prototype.name 在所有 Error 类的实例中都是相同的),那么你可以在类的原型中进行手动添加。

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"

规范

Specification
ECMAScript® 2026 Language Specification
# sec-function-instances-prototype

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp