javascript - 为什么 Function 属性定义在对象本身上(例如 Function.name),而方法定义在 Function.prototype 上?

标签 javascript function prototype

From the API属性的定义如Function.name,方法的定义如Function.prototype.call()。但在代码中我仍然以同样的方式调用它们,例如:

function Foo() {console.log("inside Foo")}
console.log(Foo.name);  // Foo
Foo.call();             // inside Foo

即我只需输入一个函数名称(Foo),然后输入我想要使用的方法/属性。那么为什么在 API 中我会看到 Function 上定义的属性和 Function.prototype 上定义的方法?

最佳答案

将方法放在原型(prototype)中允许您在所有实例之间共享它们,而不是为每个实例重复它们。

例如,Function.prototype.call 的行为不依赖于调用哪个函数。它只需要对该函数的引用(通过 this 参数接收)以便稍后调用它。

但是,诸如name之类的内在数据必须存储在函数对象本身中。它无法存储在原型(prototype)中,因为每个函数实例都有自己的名称。好吧,它可以存储为内部 [[Name]] 属性,并通过原型(prototype)中定义的 getter 和 setter 进行访问,但数据仍然需要存储在函数中。

请注意,原型(prototype)中定义了非方法属性,例如构造函数

关于javascript - 为什么 Function 属性定义在对象本身上(例如 Function.name),而方法定义在 Function.prototype 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32803473/

相关文章:

javascript - 在 Javascript ECMA6 中扩展对象时出现问题

javascript - 在网页上获取 Surface Pro 3 的高度

javascript - 如何将一个数组拆分为多个数组,每个数组都有唯一的名称

javascript - 如何使用 Javascript 调整 10 分钟倒计时器中的计时器文本和 "Time is Up"文本

JavaScript 无法读取 function() 中的变量

c# - 无法将 nuget 包安装到 azure 函数中

javascript - 如何将参数传递给函数本身就是参数的函数?

javascript - 使属性不可枚举有什么好处?

javascript - 访问指令链接内创建的原型(prototype)

javascript - 多部分 View 的 Angular Controller 结构