我猜大多数人都看过以下代码段:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
我也知道它会影响所有函数,因为它们都是Function创建的对象,因此它们可以访问名为“method”的方法,但是我很困惑为什么函数本身也可以访问“方法”,如下所示:
Function.method('test', function () {return 1;});
答案 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
,也是任何
function
是instanceof Function
和instanceof Object
,Function
本身是instanceof Function
和Object
,Construct
是instanceof Function Object
,也是Object
是instanceof Function Object
。每个function
语句和运算符都是原生new Function
的文字
每个{ }
字面值都是原生new Object
。
由new
创建的constructor
对象获取constructor.prototype
的成员
对象可以拥有任何成员,只有原型成员才能共享。