Javascript:function.prototype.method

sun*_*leo 5 javascript

我想大多数人都看过以下代码片段:

Function.prototype.method = function (name, func) {
  this.prototype[name] = func;
  return this;
};
Run Code Online (Sandbox Code Playgroud)

我也知道它会影响所有函数,因为它们都是Function创建的对象,因此它们可以访问名为"method"的方法,但是我很困惑为什么函数本身也可以访问"方法",如下所示:

Function.method('test', function () {return 1;});
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 7

Edorka的答案是正确的:函数是它自己的构造函数(即"父").

Function.constructor;  // function Function() { [native code] }
Run Code Online (Sandbox Code Playgroud)

通常你不能做你正在做的事情.例如,这不起作用:

f = function () {};
f.prototype.a = 5;
f.a;  // undefined
Run Code Online (Sandbox Code Playgroud)

这种事情只有在你使用函数作为构造函数时才有效,如下所示:

f = function () {};
f.prototype.a = 5;
g = new f();
g.a;  // 5
Run Code Online (Sandbox Code Playgroud)

但是Function很奇怪,它是所有函数的构造函数,也是一个函数本身,因此它将自己的属性模板化为自己的原型.因此,您可以调用Function.method()您的代码.


Zir*_*rak 5

因为Function它本身就是一个功能:

typeof Function === 'function'
Object.getPrototypeOf(Function) === Function.prototype
Run Code Online (Sandbox Code Playgroud)

你可以看到它被称为函数(一种间接的形式eval):

Function('return 1+2')() === 3
Run Code Online (Sandbox Code Playgroud)

所有这些都在规范中定义.

zerkms在上面的评论中提到:

首先出现 - Function对象还是Function原型?

我们必须明白,我们这些微不足道的程序员所接触到的东西与内部所代表的不同.这可以通过覆盖Array构造函数来举例说明(提示:在编写答案时不要尝试这个,你会遇到很多错误):

new Array(0, 1, 2); //gives you [0, 1, 2]
Array = function () { return [4] };
new Array(0, 1, 2); //gives you [4]
//however,
[0, 1, 2] //will always give you [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

这是因为规范中一个部分(在"语义"部分中有点下降):

令数组是创建一个新对象的结果,就好像表达式new Array()where Array是具有该名称的标准内置构造函数一样.

使用数组文字(或规范调用它的数组初始化程序),您可以确保使用内置的数组构造函数.

为什么我举这个例子?首先,因为这是一个有趣的例子.其次,展示我们的工作方式和实际工作方式.要回答zerkms,Function对象最有可能是第一个,但那不是第一个函数.我们无法访问该内置函数.