个人博客


  JS 中有一个奇怪的现象:

  我们知道,instanceof 关键字是用于判断左值的原型链上是否存在右值,那按照这样的话不就是说 ObjectFunction 存在循环继承了吗?

  那 Function 和 Object 的关系到底是什么呢?

探究

  其实对于所有构造函数/类,其 __proto__ 属性都是指向了一个函数:ƒ () { [native code] },而 Functionprototype 属性也指向了这个函数:

  而这个 [naitve code] 函数的 __proto__ 指向了 Object.prototype,因此可以说函数也是对象,所以 JS 中的所有对象都是由 Object.prototype 衍生出来的。

  因此,第一张图片中的几种表现就得到了解释:

Function instanceof Function : Function.prototype === Function.__proto__

Object instanceof Object : Object.prototype === Object.__proto__.__proto__

Function instanceof Object : Function.prototype === Object.__proto__

Object instanceof Function : Object.prototype === Function.__proto__

  ES6 中,使用 extends 继承的子类,其 __proto__ 属性是指向其父类而不是 [native code],这样就能继承父类中的静态方法了。

关于 JS 中的继承:

  原型链是基于 __proto__ 形成的,继承是通过 prototype 实现的。

  函数拥有prototype 属性,该属性值是一个object类型。当函数 A 创建对象 B (实例) 的时候,B 对象的 __proto__ 会指向 A.prototype,这就是 JS 的继承。

  再上一张网上广为流传的 JS 继承图帮助理解:

  从这张图中可以清楚的看到:所有对象的源头都是 Object.prototype

小结

  对于 Function 和 Object 的先后问题我觉得应该是要归于 Function.prototypeObject.prototype 的先后问题。

  而在 JS 中,任何构造函数都是基于 Function.prototype 创建的,因此它们的 __proto__ 属性都是指向 Function.prototype,包括 Function 自身。

  不过,一切对象的始祖都是 Object.prototype,因为 Fcuntion.prototype.__proto__Object.prototype


  以上就是个人关于 Function 和 Object 先后的理解,有什么不同看法欢迎在评论区讨论~

Object or Function-JS 中的鸡与蛋问题相关推荐

  1. php object keys_原生js中Object.keys方法详解

    实际开发中,有时需要知道对象的所有属性,原生js提供了一个方法Object.keys(). Object.keys(obj)返回的是一个数组,该数组的所有元素都是字符串.这些元素是来自于给定的obj可 ...

  2. Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性

    代码test1: var obj = {} Object.defineProperty(obj, 'method1', {value: function () {alert("Non enu ...

  3. 在js中如何判断一个对象是否为空

    网上已经有很多的回答了分别是 for in (jquery中就是这么实现的) for of JSON.stringify() == '{}' Object.getOwnPropertyNames() ...

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

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

  5. 你是否理解js的Object与Function与原型链

    js中,Function的本质是什么? Object的本质又是什么? js中有几条原型链? javascript的语言基于原型链,而实际上js的有两条原型链.开发者主要用到的是图中的红色原型链,如给A ...

  6. html中el表达式遍历list,EL表达式在JS中取出来打印[object HTMLDivElement]的问题

    今天做项目的时候,要在JS中获取请求参数中的 值,想直接用 ${param.tabName}获取,结果console.debug()打印出来,居然是  [object HTMLDivElement] ...

  7. Function和Object的鸡先蛋先问题

    详细请看木易杨的个人博客 一.Object.prototype Object.prototype是Object的原型对象,这个是显而易见的,它的[[Prototype]]属性是null,访问器属性__ ...

  8. 详解JS中的Object

    详解 JS 中的 Object 从本质上看,Object 是一个构造函数,用于创建对象. 一.Object 构造函数的属性 在 Object 中声明的属性只有两个: Object.length -- ...

  9. js中的(function(){...})()

    js中的(function(){...})() 作为一个前端小白,今天遇到了一个恶心我一天的问题,先看我的代码. for(var i=0;i<addrs.length;i++){var info ...

最新文章

  1. python编程和plc哪个好-plc和python
  2. 人与计算机猜数伪代码,《计算机和算法》PPT课件.ppt
  3. Python的Mixins机制
  4. C#学习记录3上——类的封装,继承,多态
  5. cognos-rs用下拉列表来控制交叉表的显示内容
  6. poj 1182 食物链 并查集
  7. EF更新指定字段...
  8. matlab通信工具comm,matlab无线通信例程及simulink仿真
  9. mysqldump简单解析
  10. FastFDS文件服务部署
  11. H265解码流程理解
  12. 韦根通信c语言程序,韦根26通信的示例程序
  13. 排查 java 程序CPU飙升问题
  14. linux常中的cat命令,linux下cat命令详解
  15. 领扣LintCode问题答案-5. 第k大元素
  16. 关于人生和青春的思考
  17. 蓝牙技术|蓝牙(BLE)低功耗你所不了解的特性
  18. polyline与polygon
  19. GloVe最全面、最深度的解析
  20. 零基础web前端学习路线【全新web前端入门视频教程】

热门文章

  1. 清晰还原!Photoshop处理人物模糊照片
  2. MySQL基础篇:位、字节和字符的关系
  3. 面试官:聊聊分布式事务,再说说解决方案!
  4. 如何制定一份永远完不成的年度计划?
  5. 26张图带你彻底搞懂volatile关键字
  6. 为什么你老是讲不清楚js的继承模式
  7. 阿里巴巴电商搜索推荐实时数仓演进之路
  8. 高并发下的秒杀系统架构设计实战!
  9. Redis+Nginx+设计模式+Spring全家桶+Dubbo阿里P8技术精选文档
  10. 头条创始人张一鸣没有任何大厂经验,是怎么做出这么厉害的产品的呢,以及管理这么大的团队呢?...