Javascript:function.prototype.method

时间:2013-07-03 11:07:39

标签: javascript

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

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

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

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

4 个答案:

答案 0 :(得分: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()

答案 1 :(得分:5)

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

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

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

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

所有定义为in the spec

zerkms在a comment above中问道:

  

首先是 - 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]

这是因为a section in the spec(有点下来,在“语义”部分):

  

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

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

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

答案 2 :(得分:1)

因为新函数正在使用Function的原型,所以Functions方法也使用他自己的原型方法。

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

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

答案 3 :(得分:1)

考虑以下构造函数对象:

var Construct = function () { };

原型共享功能:

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

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

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

c相同的是instanceof Construct Object,也是任何

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

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

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