JS function 是函数也是对象, 浅谈原型链
JS function 是函数也是对象, 浅谈原型链
JS 唯一支持的继承方式是通过原型链继承, 理解好原型链非常重要, 我记录下我的理解
1. 前言
new 出来的实例有 _proto_ 属性, 并且指向其构造函数的 prototype 对象
function Person(){}
const person = new Person();
person.__proto__ === Person.prototype // true
所有 new 出来的实例有 _proto_ 属性, 所有函数有 prototype 属性
不要小看任何一个对象, 这个对象有可能是一个函数; 不要小看任何一个函数, 这个函数有可能也是一个对象
只要是对象, 一定就有相应的构造函数 ( 除了 Object 的原型对象找不到 )
2. 有趣的部分
- function 是函数, 但也是对象
- Object 是函数, 但也是对象
- 看一个对象是不是函数, 就看它有没有 prototype 属性, 像原型对象没有, 它就只是单纯的对象, 不是函数 ( 原型对象无原型 )
- Function 是函数, 也是对象, 并且它作为对象的 _proto_ 属性 等于 它作为函数的 prototype 属性, 这说明, 它 自己创建自己
3. 解释
以这个为例
function Person(){}
const person = new Person();
function 是函数, 但也是对象
- 是函数
Person.prototype // {constructor: ƒ ...} Person.prototype.constructor === Person // true
这说明 Person 是函数, 有原型, 原型的 constructor 指向自己
- 是对象
Person.__proto__ // ƒ () { [native code] } Person.__proto__ === Function.prototype //true
这说明 Person 是对象, 相当于
Person = new Function(), 有没有那味了呢原型对象是单纯的对象, 不是函数
Person.prototype.prototype // undefined 不是函数, 无原型 Person.prototype.__proto__ // {constructor: ƒ...} Person.prototype.__proto__ === Object.prototype // true
原型对象无原型, 说明原型对象就只是一个对象, 是对象肯定就有构造函数, 其构造函数是 Object, 相当于
Person.prototype = new Object()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()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();
JS function 是函数也是对象, 浅谈原型链的更多相关文章
- js function定义函数的4种方法
js function定义函数的4种方法 1.最基本的作为一个本本分分的函数声明使用. 复制代码代码如下: 复制代码代码如下: function func(){} 或 var func=functio ...
- JS对象继承与原型链
1.以复制方式实现的继承 1.1浅拷贝 基本类型的复制 var parent = { lanage: "chinese" } var child = { name: "x ...
- jsp内置对象浅谈
jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- js中的函数,Date对象,Math对象和数组对象
函数就是完成某个功能的一组语句,js中的函数由关键字 function + 函数名 + 一组参数定义;函数在定义后可以被重复调用,通常将常用的功能写成一个函数,利用函数可以使代码的组织结构更多清晰. ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- js 中对象--对象结构(原型链基础解析)
对于本篇对于如何自定义对象.和对象相关的属性操作不了解的话,可以查我对这两篇博客.了解这两篇可以更容易理解本篇文章 用构造函数创建了一个对象 obj对象的本身创建了两个属性 x=1 ,y=2 ...
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...
- 关于js的几道经典题(作用域、原型链等)自己做的
1. function test() { var a = 1; setTimeout(function() { alert(a); a = 3; }, 1000); a = 2; setTimeout ...
随机推荐
- 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题
问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...
- Mybatis04
title: Mybatis学习04 date: 2020-01-20 21:48:00 tags: 这次的笔记主要是mybatis中的注解 1.实体类的注解 实体类的注解在mybati的XML文件中 ...
- 写了一个类似与豆瓣的电影的flask小demo
先展示页面 基本的功能是都已经实现了,更多那个地方是可以点的.只不过视频上面还用的宏,哎呀,感觉麻烦.有多麻烦呢,需要先定义一个宏,然后进行引用.我们才能是用,以我的观点,还不如直接是一个循环完事.. ...
- 抖音CK备份上号原理
抖音CK备份和上号是点赞跳频繁上号的最好方式,不会的可以访问网站:rz3w.com,下面介绍备份还原的原理:public void run() { MainActivity.a(this.c); ne ...
- Java获取不到请求的真实IP
问题 最近在写博客浏览量的时候,设计了这么一个逻辑:同一个IP浏览一遍文章,5分钟内不刷新次数.就需要在服务器端得到用户的真实IP,我代码是这样写的(从网上找的方法): public static S ...
- 冲刺Day7
每天举行站立式会议照片: 昨天已完成的工作: 1.确认商品分类栏,并前后端交互 2.检查.更正订单模块的代码 3.检查.更正用户模块的代码 今天计划完成的工作: 成员 任务 高嘉淳 检查代码.提供测试 ...
- js中单引号和双引号区别
总结: 1.无论单引号还是双引号都是成双成对出现的,否则报错!浏览器在读到第一个双引号开始,第二个双引号结束,同样浏览器读取单引号也是第一个开始,第二个单引号结束,在使用的时候必须遵循规则那就是一对双 ...
- 记一起由 Clang 编译器优化触发的 Crash
摘要:一个有意思的 Crash 探究过程,Clang 有 GCC 没有 本文首发于 Nebula Graph 官方博客:https://nebula-graph.com.cn/posts/troubl ...
- Java IO源码分析(三)——PipedOutputStream和PipedInputStream
简介 PipedOutputStream和PipedInputStream主要用于线程之间的通信 .二者必须配合使用,也就是一段写入,另一端接收.本质上也是一个中间缓存区,讲数据缓存在PipedInp ...
- Vscode:常用的插件
Chinese (Simplified) Language Pack for Visual Studio Code==>汉化 Live Server==>运行代码 ESLint==> ...