Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:function.prototype.method_Javascript - Fatal编程技术网

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当然,在这种情况下,鸡实际上是由一个更有知觉的生物带给我们的。问题永远解决了吗?