Javascript:function.prototype.method
我想你们大多数人都看到了以下代码片段:Javascript:function.prototype.method,javascript,Javascript,我想你们大多数人都看到了以下代码片段: Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; 我也知道它会影响所有函数,因为它们都是由函数创建的对象,所以它们可以访问名为“method”的方法,但是我不明白为什么函数本身也可以访问“method”,如下所示: Function.method('test', function () {return 1
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
我也知道它会影响所有函数,因为它们都是由函数创建的对象,所以它们可以访问名为“method”的方法,但是我不明白为什么函数本身也可以访问“method”,如下所示:
Function.method('test', function () {return 1;});
因为新函数正在使用函数的原型,functions method也在使用自己的原型方法 如果修改此方法或属性之一,并且它属于“父”原型,则使用此原型的所有其他对象都将受到影响
与这个奇怪的主题相关的一些知识:考虑以下构造函数函数对象:
var Construct = function () { };
和一个原型共享功能:
Construct.prototype.hello = function (name) { console.log("Hello " + name); };
var c = new Construct();
c.hello("World");
typeof Function === 'function'
Object.getPrototypeOf(Function) === Function.prototype
现在,如果您从构造函数中创建一个新的对象,将获得共享成员函数:
Construct.prototype.hello = function (name) { console.log("Hello " + name); };
var c = new Construct();
c.hello("World");
typeof Function === 'function'
Object.getPrototypeOf(Function) === Function.prototype
与c
相同的是instanceof Construct Object
,也是任意的
函数
是函数的实例
和对象的实例
函数
本身是函数
和对象
的实例
构造
是函数对象的实例,也是对象
是函数对象的实例函数
语句和运算符都是本机新函数的文本
每个
{}
文本都是本机新对象
由构造函数创建的new
对象获取构造函数的成员。原型
对象本身可以有任何成员,只有原型的成员才能共享。因为函数本身就是一个函数:
Construct.prototype.hello = function (name) { console.log("Hello " + name); };
var c = new Construct();
c.hello("World");
typeof Function === 'function'
Object.getPrototypeOf(Function) === Function.prototype
您可以看到它被作为函数调用(一种间接的eval
):
所有这些都如定义的那样
虫族问:
先来的是功能对象还是功能原型
我们必须明白,暴露给我们这些微不足道的程序员的东西,与内部表现的东西是不同的。这可以通过重写数组
构造函数来说明(提示:在编写答案时不要尝试此操作,否则会出现很多错误):
这是因为(在“语义”一节中有点下流):
假设数组是通过表达式new array()
创建新对象的结果,其中array
是具有该名称的标准内置构造函数
使用数组文本(或规范所称的数组初始值设定项)可以确保使用内置数组构造函数
我为什么要举这个例子?首先,因为这是一个有趣的例子。第二,证明我们所做的和实际做的是不同的。要回答zerkms的问题,函数对象很可能排在第一位,但那不是第一个函数。我们无法访问该内置函数。Edorka的回答是正确的:函数是它自己的构造函数(即“父函数”)
通常你不能做你正在做的事。例如,这将不起作用:
f = function () {};
f.prototype.a = 5;
f.a; // undefined
只有将函数用作构造函数时,这种方法才有效,如下所示:
f = function () {};
f.prototype.a = 5;
g = new f();
g.a; // 5
但是函数很奇怪,它是所有函数的构造函数,也是函数本身,所以它根据自己的原型来模板自己的属性。因此,您可以在代码中调用Function.method()
。哪个先到-是Function
对象还是Function
原型?原型,如果对象本身无法获得de-method或attribute,如果请求它到它的原型,或者原型的原型……我只考虑函数本身,它应该是object的对象,因此它只会寻找object的原型,而不是
函数本身。我只是认为对于函数本身,它应该是
对象的对象,因此它只会寻找对象的原型,而不是
函数本身。@user2546240是的。不要与typeof的结果混淆。试试instanceof。因为typeof是一个字符串,它不能同时表示函数和对象。instanceof更准确,因为它知道函数既是函数的对象又是对象的对象。“虫族问”——这实际上是一个关于“鸡对蛋”问题的笑话:-)@zerkms当然,在这种情况下,鸡实际上是由一个更有知觉的生物带给我们的。问题永远解决了吗?