javascript中Function 与Object的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript中Function 与Object的关系相关的知识,希望对你有一定的参考价值。

    javascript中,“函数”(方法)也是对象。

    一切对象都有一个根源。它是Object.prototype。

    根源之上再没有其他根源。Object.getPrototypeOf(Object.prototype)是null。js中除字面量以外的一切引用对象都来自这个“根源”对象。

    表达式Object.getPrototypeOf(Function) === Function.prototype的结果是真。这是Function特有的。实际上Function的prototype是一个内置函数,一切函数都派生自这个内置函数,这个内置函数是一个函数工厂。这个内置函数对象的prototype指向“根源”对象。

    表达式Object.prototype === Object.getPrototypeOf(Function.prototype)的结果是真。说明了Object跟Function二者之间的联系,是通过“根源”对象联系起来的。



Function和Object,既是函数,因为都可以Function()或者Object()这样的方式执行,又是对象,因为可以Function.a = 'a',Object.a = 'a'这样赋值。


说它们是函数,是因为他们都是通过上面第4条中说的”内置函数工厂“,派生出来的,因而具备函数的特性。


说他们是对象。是因为他们都是通过上面第1条中的”根源“对象,派生出来的,因此具备对象的特征。


继续说一下,Function.prototype指向”内置函数“。而Object.prototype指向”根源对象“。

因而new Function会产生一个匿名函数,而new Object产生一个plain object。


他们之间的关系简单描述就像下面这样。

参考技术A 一、从定义的角度来说:
function Function()
前者为定义一个js函数
后者为这个函数的名称
Object为选择的DOM对象

二、从用法讲:
var a = new Object(function());
这里a也是function了。

三、总结:
不管是function ,还是new Function(), 还是new Object(function()),当解释器(例如V8)遇到时,则将它们初始化成一个函数(最主要的是给其添加了一个[[call]]属性)。
参考技术B object 包含 function 参考技术C function是一种object

javascript中Function与Object

1、 先来一段代码:

console.log(Function); // function Function() { [native code] }
console.log(Object); // function Object() { [native code] }

console.log(Function.prototype); // function () {}
console.log(Object.prototype); // Object {}

console.log(Function.__proto__); //function () {}
console.log(Function.__proto__.__proto__); // Object {}
console.log(Function.__proto__.__proto__.__proto__); // null

console.log(Object.__proto__); //function () {}
console.log(Object.__proto__.__proto__); // Object {}
console.log(Object.__proto__.__proto__.__proto__); // null

console.log(Function.constructor === Function); // true
console.log(Object.constructor === Function) // true

 结论:

  a、构造器Function的构造器是它自身,因此:Function.constructor === Function;构造器Object的构造器是它自身,因此:Object.constructor === Function;ps:所有构造器的constructor都指向Function,Function是一个顶级函数;

  b、构造器Function的__proto__是一个匿名空函数function(){};

  c、匿名空函数function(){}的__proto__指向Object的prototype;

  d、Object的__proto__指向Function的prototype,也就是匿名空函数function(){};

Object继承自己,Funtion继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。这一点很特别。所有的函数都是对象,可是并不是所有的对象都是函数。

 

 来自知乎:

Object.prototype是所有对象的根源
Object.prototype只是挂载在Object函数对象上
Function.prototype构造自Object.prototype
Function.prototype 只是挂载在Function函数对象上
Object函数和Function函数构造自Function.prototype
Object字面量对象{}构造自Object.prototype
Object字面量对象{}.__proto__(原构造对象) === Object.prototype
Function函数 和 自定义函数 都继承(构造而成)自Function.prototype
Function.prototype 和 Function.__proto__(原构造对象)相同
所以,是先有的Object.prototype,再有的Function.prototype,再有的Function和Object函数对象

以上是关于javascript中Function 与Object的关系的主要内容,如果未能解决你的问题,请参考以下文章

javascript中Function与Object

JavaScript中var变量引用function与直接声明function

在javascript中Function和function有啥区别?

JavaScript中Function函数与Object对象的关系

理解Javascript_09_Function与Object

JAVAscript里的var和function啥关系?