1、先看一个控制台的输出:

instanceof 运算符字面意思是 左边是右边的一个实例吗?

但是这两条输出让人很困惑。Function 是 Object 的实例。Object 也是 Function 的实例。

学过静态语言的人看了一下就蒙了。A是B类 的实例,B又是A的实例。是不是很扯。

实际上instanceof 运算符的意识是:左边操作数的__proto__原型链上是否包括右边操作数的prototype。

也即如果有表达式:L instance R;

则运算结果是: L.__proto__.__proto__... === R.prototype ?

运算符左边最终结果是 instanceof运算时会递归查找L的原型链,即L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到顶层为止。

运算符右边只是找出了 右边操作数的prototype是什么。

所以一句话总结:instanceof 检测 左侧操作数 的__proto__原型链上,是否存在右侧的prototype原型。

以上这些看似很有道理,事实上也的确如此。但是Object 和 Function 的关系到底如何?

2、JavaScript的构造器Function 和 Object

首先明白两点 1)__proto__(原型链属性)是JavaScript中一切对象都有的属性,它一般指向创建它的函数的prototype属性(原型)有一点例外(不用函数创建对象,用var a = {}; var b = Object.create(a); 此时,b.__proto__ 指向a 而不是a.prototype,因为a是用字面值创建的对象,没有prototype属性。

       2)prototype 是只有函数对象才有的属性。它的指向一般是

最重要的一点Function.prototype.construtor指向它本身,Object.prototype.construtor也指向Function。

从这里可以说,所有的对象都是由Function生成的。

结论:构造器的原型链是封闭的,它借由一个匿名函数实现。即, Function.__proto__指向一个匿名函数function(){} ,匿名函数的__proto__指向Object的prototype ,Object的__proto__指向Function 的 prototype.

JavaScript之Function 和 Object 的区别和联系的更多相关文章

  1. javascript中function和object的区别,以及javascript如何实现面向对象的编程思想.

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. 【JavaScript】JavaScript的Function与Object浅析

    前言: JavaScript的面向对象是基于原形的,所有对象都有一条属于自己的原型链.Object与Function可能很多看Object instanceof Function , Function ...

  3. javascript中Function与Object

    1. 先来一段代码: console.log(Function); // function Function() { [native code] } console.log(Object); // f ...

  4. javascript中的Function和Object

    写的很好,理解了很多,特此转发记录 转自:http://blog.csdn.net/tom_221x/archive/2010/02/22/5316675.aspx 在JavaScript中所有的对象 ...

  5. Javascript中Function,Object,Prototypes,__proto__等概念详解

    http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...

  6. JavaScript原型链以及Object,Function之间的关系

    JavaScript里任何东西都是对象,任何一个对象内部都有另一个对象叫__proto__,即原型,它可以包含任何东西让对象继承.当然__proto__本身也是一个对象,它自己也有自己的__proto ...

  7. JavaScript笔记——引用类型之Object类型和Function类型

    <JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...

  8. JavaScript Map 和 Object 的区别

    不同点 Key filed 在 Object 中, key 必须是简单数据类型(整数,字符串或者是 symbol),而在 Map 中则可以是 JavaScript 支持的所有数据类型,也就是说可以用一 ...

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

    函数对象和其他内部对象的关系 除了函数对象,还有很多内部对象,比如:Object.Array.Date.RegExp.Math.Error.这些名称实际上表示一个 类型,可以通过new操作符返回一个对 ...

随机推荐

  1. Log4net用法(.config文件)

    1.引用log4net.dll 2.在AssemblyInfo.cs中添加初始化: [assembly: log4net.Config.XmlConfigurator(ConfigFile = &qu ...

  2. [AX]AX2012 Interaction class

    Ax2012 Client的form如果属性FormTemplate设置为DetailsPage或者ListPage,则必须同时设置属性InteractionClass为相应的Interaction类 ...

  3. iOS protocbuf安装使用

    protobuf文件地址:https://github.com/google/protobuf 1.问题/usr/local.bak/lib /usr/local.bak/man /usr/local ...

  4. python使用代理访问服务器

    python使用代理访问服务器主要有一下3个步骤: 1.创建一个代理处理器ProxyHandler: proxy_support = urllib.request.ProxyHandler(),Pro ...

  5. [转]logging使用

    来源:https://www.cnblogs.com/nancyzhu/p/8551506.html日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事 ...

  6. CentOS配制FTP服务器,并且能用root权限登录

    步骤如下: 1.运行yum install vsftpd命令 具体的细节如下:(如果无法更新,你先配置能访问互联网,我有文档叫 CentOS 在 VMware下,如何联网到Internet的解决办法可 ...

  7. 使用js是想防止表单重复提交的效果

    直接上代码: <html> <head> <title>Form表单</title> <script type="text/javasc ...

  8. 剑指offer面试题7:用两个栈实现队列

    题目1:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 代码实现: public class Solution07 { Stack<Integer> ...

  9. SQL - ROW_NUMBER,Rank 添加序号列

    百度的时候查到的博客: http://blog.csdn.net/xsfqh/article/details/6663895-------------------------------------- ...

  10. python基础---->python的使用(六)

    这里记录一下python中关于class类的一些知识.不解释就弄不懂的事,就意味着怎样解释也弄不懂. python中的类知识 一.class的属性引用与实例 class MyClass(): '''A ...