JS function 是函数也是对象, 浅谈原型链

JS 唯一支持的继承方式是通过原型链继承, 理解好原型链非常重要, 我记录下我的理解

1. 前言

  1. new 出来的实例有 _proto_ 属性, 并且指向其构造函数的 prototype 对象

    function Person(){}
    const person = new Person();
    person.__proto__ === Person.prototype // true
  2. 所有 new 出来的实例有 _proto_ 属性, 所有函数有 prototype 属性

  3. 不要小看任何一个对象, 这个对象有可能是一个函数; 不要小看任何一个函数, 这个函数有可能也是一个对象

  4. 只要是对象, 一定就有相应的构造函数 ( 除了 Object 的原型对象找不到 )

2. 有趣的部分

  1. function 是函数, 但也是对象
  2. Object 是函数, 但也是对象
  3. 看一个对象是不是函数, 就看它有没有 prototype 属性, 像原型对象没有, 它就只是单纯的对象, 不是函数 ( 原型对象无原型 )
  4. Function 是函数, 也是对象, 并且它作为对象的 _proto_ 属性 等于 它作为函数的 prototype 属性, 这说明, 它 自己创建自己

3. 解释

  1. 以这个为例

    function Person(){}
    const person = new Person();
  2. function 是函数, 但也是对象

    • 是函数
    Person.prototype  // {constructor: ƒ ...}
    
    Person.prototype.constructor === Person // true

    这说明 Person 是函数, 有原型, 原型的 constructor 指向自己

    • 是对象
    Person.__proto__  // ƒ () { [native code] }
    
    Person.__proto__ === Function.prototype //true

    这说明 Person 是对象, 相当于 Person = new Function() , 有没有那味了呢

  3. 原型对象是单纯的对象, 不是函数

    Person.prototype.prototype  // undefined 不是函数, 无原型
    
    Person.prototype.__proto__  // {constructor: ƒ...} 
    
    Person.prototype.__proto__ === Object.prototype  // true

    原型对象无原型, 说明原型对象就只是一个对象, 是对象肯定就有构造函数, 其构造函数是 Object, 相当于 Person.prototype = new Object()

  4. Object 是函数, 但也是对象

    Object.prototype  // {constructor: ƒ ...} 是函数, 有原型
    
    Object.prototype.__proto__  // null 所有对象都有其构造函数,  Object 原型对象例外
    
    Object.__proto__  // ƒ () { [native code] } Object 是对象
    
    Object.__proto__ === Function.prototype  // true

    Object 有原型对象, 说明它是个函数, 并且它的原型是唯一一个找不到构造函数的; Object 是对象, 有自己的构造函数, 并且它的构造函数是 Function. 相当于 Object = new Function()

  5. Function 是函数, 也是对象, 并且它自己创建自己

    Function.prototype  // ƒ () { [native code] } 是函数
    
    Function.__proto__  // ƒ () { [native code] } 是对象
    
    Function.__proto__ === Function.prototype  // true
    
    Function.prototype.__proto__ === Object.prototype  // true

    经过前面的讨论, 从这个代码可以看出, Function 即是函数也是对象, 并且相当于自己创建了自己, 相当于 Function = new Function(); ; Function 的原型对象的构造函数也是 Object, 相当于 Function.prototype = new Object()

4. 关系图

new 的看法, new 出来的对象一定有 _proto_ 指向其构造函数的 prototype.

Function = new Function();
Object = new Function();
Person = new Function();
所有的原型对象 = new Object(); // 非继承, 人为修改后会发生变化
person = new Person();

最新文章

  1. [高并发]Java高并发编程系列开山篇--线程实现
  2. Java字节、十进制、十六进制、字符串之间的相互转换
  3. 前端之html
  4. iOS 自定义的CodeSnippets添加按下tab键切换到指定输入位置
  5. MongoDB-安装&启动
  6. SqlBulkCopy 简单运用
  7. Android平台下实现录音及播放录音功能的简介
  8. Host绑定
  9. div 显示滚动条
  10. 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)
  11. 【转】Eclipse自动补全的设置方法
  12. OS之多线程
  13. Spark编程进阶
  14. 关于phpMyAdmin表数据不能编辑更改的问题
  15. JS中的作用域以及全局变量的问题
  16. VM虚拟机拍摄快照时出错或者克隆失败解决办法
  17. HDU1199 动态线段树 // 离散化
  18. L1 与 L2 正则化
  19. Ubunt 使用Virtualbox虚拟机NAT无法上网解决办法
  20. THINKPHP5 volist标签循环不能设置循环变量为$i

热门文章

  1. jupyterlab 增加新内核的方法ipykernel
  2. react项目引入使用element-react报错
  3. 题解-CF101D Castle
  4. 题解-CF1418G Three Occurrences
  5. KVM初体验之virt-manager unable to connect to libvirt的处理办法
  6. apache重写URL时,排除静态资源
  7. Python最会变魔术的魔术方法,我觉得是它!
  8. Hbase备份以及清表脚本
  9. SSRF深入学习
  10. Solr:Slor初识(概述、Windows版本的安装、添加IK分词器)