Object or Function-JS 中的鸡与蛋问题
个人博客
JS 中有一个奇怪的现象:
我们知道,instanceof
关键字是用于判断左值的原型链上是否存在右值,那按照这样的话不就是说 Object
和 Function
存在循环继承了吗?
那 Function 和 Object 的关系到底是什么呢?
探究
其实对于所有构造函数/类,其 __proto__
属性都是指向了一个函数:ƒ () { [native code] }
,而 Function
的 prototype
属性也指向了这个函数:
而这个 [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.prototype
和 Object.prototype
的先后问题。
而在 JS 中,任何构造函数都是基于 Function.prototype
创建的,因此它们的 __proto__
属性都是指向 Function.prototype
,包括 Function 自身。
不过,一切对象的始祖都是 Object.prototype
,因为 Fcuntion.prototype.__proto__
是 Object.prototype
。
以上就是个人关于 Function 和 Object 先后的理解,有什么不同看法欢迎在评论区讨论~
Object or Function-JS 中的鸡与蛋问题相关推荐
- php object keys_原生js中Object.keys方法详解
实际开发中,有时需要知道对象的所有属性,原生js提供了一个方法Object.keys(). Object.keys(obj)返回的是一个数组,该数组的所有元素都是字符串.这些元素是来自于给定的obj可 ...
- Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性
代码test1: var obj = {} Object.defineProperty(obj, 'method1', {value: function () {alert("Non enu ...
- 在js中如何判断一个对象是否为空
网上已经有很多的回答了分别是 for in (jquery中就是这么实现的) for of JSON.stringify() == '{}' Object.getOwnPropertyNames() ...
- 先有对象还是先有函数,鸡生蛋、蛋生鸡的问题。有关js里内置对象Function和Object的思考
js里创建的函数本身作为一个实例对象都是由内置对象Function作为构造函数创造出来的,所谓var f = funciton(a){b}即等同于f = new Function(a,b). 同时js ...
- 你是否理解js的Object与Function与原型链
js中,Function的本质是什么? Object的本质又是什么? js中有几条原型链? javascript的语言基于原型链,而实际上js的有两条原型链.开发者主要用到的是图中的红色原型链,如给A ...
- html中el表达式遍历list,EL表达式在JS中取出来打印[object HTMLDivElement]的问题
今天做项目的时候,要在JS中获取请求参数中的 值,想直接用 ${param.tabName}获取,结果console.debug()打印出来,居然是 [object HTMLDivElement] ...
- Function和Object的鸡先蛋先问题
详细请看木易杨的个人博客 一.Object.prototype Object.prototype是Object的原型对象,这个是显而易见的,它的[[Prototype]]属性是null,访问器属性__ ...
- 详解JS中的Object
详解 JS 中的 Object 从本质上看,Object 是一个构造函数,用于创建对象. 一.Object 构造函数的属性 在 Object 中声明的属性只有两个: Object.length -- ...
- js中的(function(){...})()
js中的(function(){...})() 作为一个前端小白,今天遇到了一个恶心我一天的问题,先看我的代码. for(var i=0;i<addrs.length;i++){var info ...
最新文章
- python编程和plc哪个好-plc和python
- 人与计算机猜数伪代码,《计算机和算法》PPT课件.ppt
- Python的Mixins机制
- C#学习记录3上——类的封装,继承,多态
- cognos-rs用下拉列表来控制交叉表的显示内容
- poj 1182 食物链 并查集
- EF更新指定字段...
- matlab通信工具comm,matlab无线通信例程及simulink仿真
- mysqldump简单解析
- FastFDS文件服务部署
- H265解码流程理解
- 韦根通信c语言程序,韦根26通信的示例程序
- 排查 java 程序CPU飙升问题
- linux常中的cat命令,linux下cat命令详解
- 领扣LintCode问题答案-5. 第k大元素
- 关于人生和青春的思考
- 蓝牙技术|蓝牙(BLE)低功耗你所不了解的特性
- polyline与polygon
- GloVe最全面、最深度的解析
- 零基础web前端学习路线【全新web前端入门视频教程】