如果函数是javascript中的对象,为什么function.constructor指向Function而不是Object?

时间:2016-02-29 20:35:17

标签: javascript

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

         function userInfo() {};

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

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

         Function.constructor

3 个答案:

答案 0 :(得分:2)

userInfo.constructorFunction因为:

  1. userInfo没有自己的constructor属性。
  2. userInfo的[[原型]]内部广告位的值为Function.prototype
  3. Function.prototype拥有自己的constructor媒体资源,其值为Function
  4. 由于同样的原因,

    Function.constructor也是Function

    1. Function没有自己的constructor属性。
    2. Function的[[原型]]内部广告位的值为Function.prototype
    3. Function.prototype拥有自己的constructor媒体资源,其值为Function
    4. 也就是说,Function个实例(例如userInfoFunction本身)从constructor继承了Function.prototype属性,可以用来知道它们是Function的实例。

答案 1 :(得分:0)

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

的原因
var obj = {};
function myFunc() {}

console.log(obj.constructor)
console.log(myFunc.constructor)

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

此外,Function是任何函数的构造函数。任何构造函数都是函数,这也是函数也具有.constructor属性

的函数

点击此链接http://ejohn.org/apps/learn/#16

答案 2 :(得分:0)

任何对象的构造函数属性值都是从其原型对象的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继承。

  • 在代码中使用“constructor”属性并不能保证安全。虽然prototype的{​​{1}}属性及其constructor属性可能不会更改,但一般情况下都不会对函数对象进行写保护。