5

我想你们中的大多数人都看过下面的代码片段:

Function.prototype.method = function (name, func) {
  this.prototype[name] = func;
  return this;
};

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

Function.method('test', function () {return 1;});
4

4 回答 4

7

Edorka 的回答是正确的:函数是它自己的构造函数(即“父”)。

Function.constructor;  // function Function() { [native code] }

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

f = function () {};
f.prototype.a = 5;
f.a;  // undefined

仅当您将函数用作构造函数时,这种事情才有效,如下所示:

f = function () {};
f.prototype.a = 5;
g = new f();
g.a;  // 5

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

于 2013-07-03T11:33:35.827 回答
5

因为Function它本身就是一个函数:

typeof Function === 'function'
Object.getPrototypeOf(Function) === Function.prototype

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

Function('return 1+2')() === 3

规范中定义的所有内容。

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]

这是因为规范中的一个部分(有点向下,在“语义”部分):

让数组成为创建新对象的结果,就好像通过表达式new Array()whereArray是具有该名称的标准内置构造函数一样。

使用数组字面量(或规范调用的数组初始值设定项),您可以确保使用内置的Array 构造函数。

我为什么要举这个例子?首先,因为这是一个有趣的例子。其次,展示我们所做的和实际所做的不同。为了回答 zerkms,Function 对象很可能是最先出现的,但这不是第一个函数。我们无权访问该内置函数。

于 2013-07-03T11:32:56.767 回答
1

因为新函数使用的是Function的原型,Functions方法也使用了自己的原型方法。

如果您修改此方法或属性之一并且它属于“父”原型,则使用此原型的所有其他对象都将受到影响。

一些与这个奇怪主题相关的知识:http: //www.packtpub.com/article/using-prototype-property-in-javascript

于 2013-07-03T11:09:02.590 回答
1

考虑以下构造函数对象:

var Construct = function () { };

还有一个原型共享函数:

Construct.prototype.hello = function (name) { console.log("Hello " + name); };

现在,如果您new从构造函数创建一个对象,这将获得共享成员函数:

var c = new Construct();
c.hello("World");

c和is一样instanceof Construct Object, 也一样

  • functioninstanceof Functioninstanceof Object,
  • Function本身是instanceof FunctionObject,
  • Constructinstanceof Function Object并且也是
  • Objectinstanceof Function Object

每个function语句和运算符都是 native 的文字new Function
每个{ }字面量都是原生的new Object

new由 a创建的对象constructor获取constructor.prototype.
对象可以有自己的任何成员,只有原型的成员才能共享。

于 2013-07-03T11:29:37.740 回答