从这样的窗口对象创建以下函数时,
function userInfo() {};
userInfo.constructor如何显示Function而不是Object,因为函数是对象?
使用以下内容时,它甚至会显示Function而不是Object
Function.constructor
答案 0 :(得分:2)
userInfo.constructor
是Function
因为:
userInfo
没有自己的constructor
属性。userInfo
的[[原型]]内部广告位的值为Function.prototype
。Function.prototype
拥有自己的constructor
媒体资源,其值为Function
。 Function.constructor
也是Function
:
Function
没有自己的constructor
属性。Function
的[[原型]]内部广告位的值为Function.prototype
。Function.prototype
拥有自己的constructor
媒体资源,其值为Function
。也就是说,Function
个实例(例如userInfo
或Function
本身)从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属性
的函数答案 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
属性可能不会更改,但一般情况下都不会对函数对象进行写保护。