我的上一篇文章有解释绅士原型及简单的原型链,在这里我将对原型链做完整讲述;

  1. // 函数的原型链: 把函数当对象(实例对象)来看
  2.  
  3. function Person(){}
  4. // 底层Function创建出来的Person, 底层中任意函数都是Function创建的
  5. // var Person = new Function();
  6.  
  7. // 把Person 当孩子来看,Person对象的原型链长啥样
  8. // Person ==> Function.prototype ==> Object.prototype ==> null;
  9. // console.log( Person.__proto__ == Function.prototype );
  10. // console.log( Function.prototype.__proto__ );
  11. // Person.prototype 这个prototype属性是函数Person自带的
  12. // Function.prototype 是唯一的原型对象的类型是个函数的
  13. // Function.prototype 原型对象有call apply bind三个方法
  14. console.dir( Function.prototype );
  15. // 函数都可以去使用call apply bind方法, 是的
完整版原型链:
核心的点: 函数的双重身份
1. 函数当函数用
2. 函数也是对象
  1. // 1. 把Person函数当函数用,具体当构造函数用
  2. function Person(){}
  3. var p = new Person();
  4. // 绘制以上代码的原型三角关系
  5. // 构造函数: Person
  6. // 原型对象: Person.prototype
  7. // 实例对象: p
  8. // console.log( Person.prototype.__proto__ === Object.prototype );
  9.  
  10. // 2. 把Person函数当对象看,当实例对象看(孩子)
  11. // Person这个孩子谁创建的?
  12. // 底层 var Person = new Function();
  13. // 绘制以上代码的原型三角关系
  14. // 构造函数: Function
  15. // 原型对象: Function.prototype
  16. // 实例对象: Person
  17.  
  18. // 3. 把Object考虑进来,把Object当构造函数来看
  19. var obj = new Object();
  20. // 绘制以上代码的原型三角关系
  21. // 构造函数: Object
  22. // 原型对象: Object.prototype
  23. // 实例对象: obj
  24. // 4. 把Object当实例对象来看,孩子看,Object孩子谁生的
  25. // 底层 var Object = new Function();
  26. // 绘制以上代码的原型三角关系
  27. // 构造函数: Function
  28. // 原型对象: Function.prototype
  29. // 实例对象: Object
  30. // console.log( Object.__proto__ === Function.prototype );
  31.  
  32. // 5. Function 函数是谁生下来的,是Function自己
  33. // var Function = new Function();
  34. // 绘制以上代码的原型三角关系
  35. // 构造函数: Function
  36. // 原型对象: Function.prototype
  37. // 实例对象: Function
  38. console.log( Function.__proto__ == Function.prototype );
小结:
 1. 函数是函数,也是对象
     是函数有prototype属性
     是对象有__proto__属性
     所以函数有prototype也有__proto__属性
2. 任何函数的原型链都有 Function.prototype
3. 任何对象的原型链上都有 Object.prototype
4. 函数是一等公民(特权)
      typeof 函数 ==> function
      Function 生自己
      Function.prototype 原型对象的类型是唯一的函数类型

案例:

  1. console.log( Function.prototype === Function.prototype ); // true
  2. console.log(Object.__proto__ === Function.prototype); // true
  3. console.log( Function.prototype.__proto__ === Object.prototype ); // true
  4. console.log( Object.prototype.__proto__ === Object.prototype ); // false
  5. console.log( Object.__proto__.__proto__ === Object.prototype ); // true
  6. // 面试题
  7. // Function的prototype原型对象有没有在Function对象的原型链上
  8. /*console.log(Function instanceof Function); // true
  9. console.log(Function instanceof Object); // true
  10. console.log(Object instanceof Function); // true
  11. console.log(Object instanceof Object); // true*/
  12.  
  13. // 练习
  14. function Person() {}
  15. var p = new Person()
  16. console.log(p.constructor); // Person
  17. console.log(Person.constructor); // Function

JavaScript之函数原型链完整版的更多相关文章

  1. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

  2. 图解JavaScript中的原型链

    转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...

  3. JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链、闭包解析)

    1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = fu ...

  4. JAVASCRIPT闭包以及原型链

    方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...

  5. javaScript里的原型链

    原型对象也是普通的对象,是对象一个自带隐式的__proto__属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链.原型链是由一些用来继承和共享属性的对象组成的( ...

  6. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

  7. 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结

    1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象    ...

  8. JavaScript中的原型链和继承

    理解原型链 在 JavaScript 的世界中,函数是一等公民. 上面这句话在很多地方都看到过.用我自己的话来理解就是:函数既当爹又当妈."当爹"是因为我们用函数去处理各种&quo ...

  9. JavaScript -- 继承与原型链

    JavaScript对象有一个指向一个原型对象的链,当试图访问一个对象的属性的时候,他不仅仅会在该对象上面搜寻,还会搜寻该对象的原型,以及对象的原型的原型,依次层层搜索,直到找到名字匹配的属性或者到达 ...

随机推荐

  1. centos 7 安装zabbix-4.0

    第一步:安装nginx ############安装Nginx###########yum localinstall http://nginx.org/packages/centos/7/noarch ...

  2. YoyoGo微服务框架入门系列-基本概念

    前言 Github开源:github.com/yoyofx/yoyogo 还请多多Star 之前简单介绍了YoyoGo微服务框架的基本内容,接下来了解下框架中的基本概念. 从一个简单Web服务Demo ...

  3. 如何让文科生5分钟写上Python

    序言 这篇文章是转型后发表的第一篇文章,有必要先聊一下我的写文计划. 串行文章和并行文章 我会按照发文顺序分为串行文章和并行文章.Python 语言本身的内容,我会按照入门.进阶.原理的顺序依次展开. ...

  4. SPG-Net: Segmentation Prediction and Guidance Network for Image Inpainting

    SPG-Net: Segmentation Prediction and Guidance Network for Image Inpainting pytorch 引言 利用语义分割获取空洞的边缘信 ...

  5. Vue.js 桌面端自定义滚动条组件|vue美化滚动条VScroll

    基于vue.js开发的小巧PC端自定义滚动条组件VScroll. 前段时间有给大家分享一个vue桌面端弹框组件,今天再分享最近开发的一个vue pc端自定义滚动条组件. vscroll 一款基于vue ...

  6. c++11-17 模板核心知识(十)—— 区分万能引用(universal references)和右值引用

    引子 如何区分 模板参数 const disqualify universal reference auto声明 引子 T&&在代码里并不总是右值引用: void f(Widget&a ...

  7. How tomcat works(深入剖析tomcat)(7) Logger

    How tomcat works (7)日志记录器 总体概述 顾名思义,这一章将的是tomcat的日志记录器组件,比较简单,tomcat提供了几种类型不同的日志记录器,但是所有的日志记录器都需要实现L ...

  8. NTML

     NTLM:         1.客户端向服务器发送一个请求,请求中包含明文的登陆用户名.在服务器中已经存储了登陆用户名和对应的密码hash         2.服务器接收到请求后,NTLMv2协议下 ...

  9. Splay树求第k大模板

    今天上午借着休息日得机会手撸了一下模板,终于对着模板调出来了.prev和next占用了std namespace里面的东西,然后报警我上次给关了所以.....就花了3个小时吧. inline加不加无所 ...

  10. PyQt+moviepy音视频剪辑实战文章目录

    ☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ...