【问题标题】:If Functions are objects in javascript, why the function.constructor points to Function instead of Object?如果函数是javascript中的对象,为什么function.constructor指向Function而不是Object?
【发布时间】:2016-02-29 20:35:16
【问题描述】:

当像这样从窗口对象创建以下函数时,

         function userInfo() {};

为什么 userInfo.constructor 显示 Function 而不是 Object,因为函数是对象?

在使用以下内容时,它甚至显示 Function 而不是 Object,

         Function.constructor

【问题讨论】:

  • 数组是具有 Array 构造函数的对象。 Date 实例是具有 Date 构造函数的对象。某些东西可以是一个对象,而不是由 Object 构造函数构造。
  • Functions 是对象,而不是 Objects。
  • 为什么new userInfo.prototype.constructor() 创建对象而new userInfo.constructor() 没有?

标签: javascript


【解决方案1】:

userInfo.constructorFunction 因为:

  1. userInfo 没有自己的 constructor 属性。
  2. userInfo的[[Prototype]]内部槽的值为Function.prototype
  3. Function.prototype 有一个自己的constructor 属性,其值为Function

Function.constructor 也是Function,原因相同:

  1. Function 没有自己的 constructor 属性。
  2. Function的[[Prototype]]内部槽的值为Function.prototype
  3. Function.prototype 有一个自己的constructor 属性,其值为Function

也就是说,Function 实例(如userInfoFunction 本身)从Function.prototype 继承constructor 属性,可用于知道它们是Function 的实例。

【讨论】:

    【解决方案2】:

    函数是高级对象。实际上,函数是一个对象。这就是为什么您可以为您的函数分配任何值,例如userInfo.anotherFunction = function() { return 'something'};,然后调用userInfo.anotherFunction();。这就是为什么你有两个

    var obj = {};
    function myFunc() {}
    
    console.log(obj.constructor)
    console.log(myFunc.constructor)
    

    这些都将打印函数作为构造函数。 简单地说,如果每个对象都有.constructor 属性,并且javascript 中的任何函数本身就是对象,那么您肯定会在任何函数上都有.constructor 属性。

    Function 也是任何函数的构造函数。任何构造函数都是函数,这就是为什么 Function 也有 .constructor 属性

    查看此链接http://ejohn.org/apps/learn/#16

    【讨论】:

    【解决方案3】:

    任何对象的构造函数属性值都继承自其原型对象的constructor属性值。

    对象的原型在创建时设置为用于构造它的函数(对象)的prototype 属性值。

    因为函数对象是使用全局Function构造函数创建的,所以它们继承Function作为它们的constructor属性:

     function Foo(){};  // Foo is constructed by global object "Function".
     Foo.constructor;   // Function, inherited from Function.prototype.constructor property
    

    注意Function的原型对象在本机代码中设置为Function.prototype

    Object.getPrototypeOf(Function) === Function.prototype // is true.
    

    这意味着添加到 Function.prototype 的任何属性都由 Function 继承。这是可取的,因为Function 当然是一个函数。然而,作为一种隐含的副作用,它也会导致本机代码 Function 作为自身的构造函数返回。

    还有:

    • Function.prototype 是 Object 的一个实例,因此函数对象也继承自 Object.prototype。

    • 在代码中使用“构造函数”属性不能保证安全。虽然prototype 属性及其constructor 属性可能不会针对Function 进行更改,但通常也不会针对函数对象进行写保护。

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多