详细请看木易杨的个人博客

一、Object.prototype

Object.prototype是Object的原型对象,这个是显而易见的,它的[[Prototype]]属性是null,访问器属性__proto__,指向一个对象的内部[[Prototype]],Object.prototype的__proto__也就指向null,所以我们会说,null是原型链的顶端

但是我们需要了解的一点是 Object.prototype并不是通过Object函数创建的,它其实是浏览器底层根据ECMAScript规范创造的一个对象,原因如下:
实例对象的__proto__指向构造函数的prototype,但是Object.prototype.__proto__是指向null的,代表Object.prototype它不是任何一个构造函数的实例,它是凭空创造出来的,浏览器底层创造出来的

所以在不考虑null的情况下,Object.prototype就是原型链的顶端,所有对象都继承了它的toString等方法和属性

二、Function.prototype

Function.prototype对象是一个函数,其[[Prototype]]内部属性值指向内建对象的Object.ptototype.Function.prototype对象自身是没有valueOf属性的,其从Object.prototype对象继承了valueOf属性

Function.prototype 的 [[Class]] 属性是 Function,所以这是一个函数,但又不大一样,因为我们知道只有函数才有prototype属性,但并不是所有函数都有这个属性,Function.prototype就没有,Function.prototype.prototype为undefined

let fun = Function.prototype.bind()function.prototype也为undefined

根据木易杨的理解,是Function.prototype是引擎创建出来的函数,引擎认为不需要给这个函数对象添加prototype属性,不然Function.prototype.prototype…将无休止且没有存在的意义

三、function Object

Object作为构造函数时,其[[Prototype]]内部属性值指向Function.prototype

  • 使用对象字面量创建的对象,其 [[Prototype]] 值是 Object.prototype。

  • 使用数组字面量创建的对象,其[[Prototype]] 值是 Array.prototype。

  • 使用 function f(){} 函数创建的对象,其 [[Prototype]] 值是 Function.prototype。

  • 使用 new fun() 创建的对象,其中 fun 是由JavaScript 提供的内建构造器函数之一(Object,Function,Array, Boolean, Date,Number, String 等等),其[[Prototype]]值是fun.prototype。

  • 使用其他 JavaScript构造器函数创建的对象,其 [[Prototype]] 值就是该构造器函数的 prototype 属性。

四、function Function

Function构造函数是一个函数对象,其[[Class]]属性是Function。Function的[[Prototype]]属性指向了Function.prototype

五、分析

Object instanceof Function //true
Function instanceof Object //trueObject instanceof Object //true
Function instanceof Function //true

所以到底谁继承了谁,谁有是谁的源头?

Function.prototype 和 Function.__proto__都指向了Function.prototype

1、关于Function.proto === Function.prototype有两种解释,争论点在于,Function对象是不是由Function构造函数创建的一个实例

one:
按照javaScript中"实例"的定义,a是b的实例即a instanceof b为true,默认的判断条件就是b.prototype在a的原型链上。而Function instanceof Function为true,本质上即Object.getPrototypeOf(Function) === Function.prototype,正符合此定义

two:
Function是built-in的对象,也就是并不存在“Function对象是由Function构造函数创建”这样会显然造成鸡生蛋蛋生鸡的问题。实际上,当你直接写一个函数时(如function
f(){} 或 x => x,也不存在调用Function构造器,只有在显示调用Funtion构造器时才有

木易杨比较偏向于第二种解释,即现有Function.prototype然后有的function Function(),所以就不存在鸡生蛋蛋生鸡的问题了,把Function.__proto__指向Function.prototype是为了保证原型链的完整,让Function可以获取定义在Object.prototype上的方法


Function和Object的鸡先蛋先问题相关推荐

  1. 先有对象还是先有函数,鸡生蛋、蛋生鸡的问题。有关js里内置对象Function和Object的思考

    js里创建的函数本身作为一个实例对象都是由内置对象Function作为构造函数创造出来的,所谓var f = funciton(a){b}即等同于f = new Function(a,b). 同时js ...

  2. Object or Function-JS 中的鸡与蛋问题

    个人博客   JS 中有一个奇怪的现象:   我们知道,instanceof 关键字是用于判断左值的原型链上是否存在右值,那按照这样的话不就是说 Object 和 Function 存在循环继承了吗? ...

  3. object htmldivelement什么意思_深入探究 Function amp; Object 鸡蛋问题

    (给前端树加星标,提升前端技能) 转自:高级前端进阶 引言 上篇文章用图解的方式向大家介绍了原型链及其继承方案,在介绍原型链继承的过程中讲解原型链运作机制以及属性遮蔽等知识,今天这篇文章就来深入探究下 ...

  4. R语言构建xgboost模型:自定义损失函数(目标函数、loss function、object function)、评估函数(evaluation function)

    R语言构建xgboost模型:自定义损失函数(目标函数.loss function.object function).评估函数(evaluation function) 目录

  5. 安装node-sass运行报错 Module build failed: TypeError: this.getResolve is not a function at Object.loader

    在搭建vue脚手架 或者是在vue项目中,想使用sass的功能, npm install node-sass --save-dev //安装node-sass npm install sass-loa ...

  6. devc 无法编译循环语句_鸡生蛋还是蛋生鸡?详解第一个编译器是怎么来的~

    详解编译器自举原理 不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是"鸡生蛋,蛋生鸡"的问题吗? 先说最后的结论:任何一种语言的第一个编译器肯定是使用其他语言写 ...

  7. SmartCode.ETL 这不是先有鸡还是蛋的问题!

    继国庆节 SmartCode 正式版(SmartCode.Generator)发布之后,SmartCode 迎来了新的能力 SmartCode.ETL ! SmartCode 正式版从开始发布就从未说 ...

  8. Function与Object

    Function与Object JavaScript中内置了两个顶级对象Function.Object,Object是所有对象的基类,而所有的构造函数同时又是Function对象的实例. Object ...

  9. 错误信息:cannot call member function ‘ ‘ without object 处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.源码展示 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一.源码展示 std::vectorstd::strin ...

最新文章

  1. Java基础:成员变量的继承与覆盖
  2. 一个好用的ODBC数据库类CMYODBC
  3. PAT甲级1025 PAT Ranking:[C++题解]排序、结构体、排名
  4. 01-MPLS产生的背景/以及和其他技术比较的优势
  5. java动态代理_Java 动态代理和依赖注入
  6. C语言递归方式实现冒泡排序(bubble排序)算法(附完整源码)
  7. camunda 流程执行追踪_九思OA项目管理解决方案:规范企业项目流程,掌握项目进展...
  8. 【MySQL】MySQL出现Waiting for table metadata lock的原因、解决方法
  9. live linux 密码,Linux_如何使你的Linux系统省略输入用户名密码,在做Livecd的时候总是要输入用 - phpStudy...
  10. Spring实现多数据源配置
  11. Linq to Oracle 使用教程(三)数据的增、删、改
  12. python dll load fail_python报错DLL load failed:找不到模块怎么解决?
  13. 深入浅出Docker(六):像谷歌一样部署你的应用
  14. php 读xml的两种方式
  15. VGGNet网络结构学习
  16. hibernate中持久化类的编写规则和主键生成策略
  17. 基于VerilogHDL的VGA驱动设计
  18. 天刀手游pc端显示服务器维护,天刀手游电脑版无法更新网络修复工具
  19. javaweb_XML学习
  20. 5.Wide Deep Learning for Recommender Systems论文详细解读和代码实现

热门文章

  1. windows api实现窗口、按钮、静态文本框透明显示
  2. Oracle 中 in 的用法
  3. 当无触控板和鼠标的情况下,如何开启触控板
  4. 关于VS中如何打开控制台
  5. 批量修改文件名 两种方法
  6. 0107无穷小的比较-函数与极限
  7. 得大数据者 得新工业革命先机
  8. 【ArcGIS】ArcGIS10.8版本的下载安装及其注意事项-保姆教程
  9. 网络信息对抗基础概念
  10. 半个屁股和女人的胸脯