【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

彻底深刻理解 js 原型链之 prototype,proto 以及 constructor(一)

  • 2020-10-17
  • 本文字数:2321 字

    阅读完需:约 8 分钟

彻底深刻理解js原型链之prototype,proto以及constructor(一)

前言

以下概念请花费一定的时间彻底理解,才能进行下一步,思考题一定要思考,这样才能彻底掌握原型链的知识点,教程中如果有任何的错误不足请指正!

函数对象

由 function 创造出来的函数,比如:


    function a(){};    var b=function(){};
复制代码


系统内置的函数对象


Function,Object,Array,String,Number
复制代码


只有函数对象才有 prototype 属性 ,重要的事情说三遍!


思考: js 的引用数据类型都属于函数对象吗?

普通对象

除开函数对象之外的对象都是普通对象


var b='qwe'; // b 是字符串类型,属于普通对象var c=123;; // c 是数字类型,属于普通对象
复制代码


思考:js 有五种基本类型:Undefined,Null,Boolean,Number 和 String,他们都是属于普通对象吗?

原型对象

prototype 属性也叫原型对象,主要是为了实现继承和共享属性;


可以说我们的每一次编程,内在都有原型对象来发挥着作用,如果你没有掌握原型对象的含义,那么你的 js 还没有真正的入门!


function a(){};
复制代码


首先对象 a 是由 Function 创造出来,是函数对象;那么根据我们以上的教程,a 就有了 prototype 属性,那么这个原型对象是怎么创造出来的呢? 来看下面这个例子:


var temp = new a();a.prototype=new Object();a.prototype = temp;
复制代码


那么 a 的 prototype 属性就是这样创造出来的;


思考:原型对象 prototype 属于函数对象吗?

指针 proto

JavaScript 中,万物皆对象!所有的对象 obj 都具有 proto 属性(null 和 undefined 除外),可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型


请看以下例子帮助理解:


function a(){};var obj=new a();console.log(a.__proto__===Function.prototype); //trueconsole.log(a.prototype.__proto__===Object.prototype); //trueconsole.log(obj.__proto__===a.prototype); //true
复制代码


思考一下,var obj={}; obj.prototype. proto 指向谁?

构造函数属性 constructor

假设 obj 是由函数对象 a 由 new 运算创造出来的,那么 obj 的 constructor 的属性就存放着一个对 a 的引用,通过这个构造函数,我们还可以为 a 添加其他属性和方法, 这个属性的最初设计是为了检测对象的数据类型,不过后来人们通过此属性的特性做了更多的事情


请看以下例子:


function a(){};var obj=new a();obj.constructor.b=`我是a的新的属性`;console.log(a.b); //我是a的新的属性console.log(a.constructor===Function); //trueconsole.log(a.prototype.constructor===a); //trueconsole.log(obj.constructor===a); //true
复制代码


函数 a 是由 Function 创造出来,那么它的 constructor 指向的 Function,obj 是由 new a()方式创造出来,那么 obj.constructor 理应指向 a


思考:a.prototype. proto .constructor 指向谁?

思考题解答

函数对象思考题解答

思考: js 的引用数据类型都属于函数对象吗?


引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象


那么数组,普通对象,函数对象都算是引用数据类型,引用数据类型范围包含函数对象的范围

普通对象思考题解答

思考:js 有五种基本类型:Undefined,Null,Boolean,Number 和 String,他们都是属于普通对象吗?


基本类型值:指的是保存在栈内存中的简单数据段;除开函数对象之外的对象都是普通对象,那么普通对象范围是包含基本数据类型的


事实上(函数对象,普通对象)以及(基本数据类型,引用数据类型)是在不同角度对 js 变量进行的定义

原型对象思考题解答

思考:原型对象 prototype 属于函数对象吗?


事实上 这个问题要进行分别回答:


Function.prototype 属于函数对象,其他对象的 prototype 属于普通对象


function a(){};console.log(typeof Function.prototype); // functionconsole.log(typeof a.prototype); //object
复制代码


前面说过 prototype 的创造过程


    var temp = new a();    a.prototype = temp;
复制代码


这里 temp 当然就是普通对象啦,但是看下 Function 的 prototype 创造过程


var a = new Function();Function.prototype = a;
复制代码


看明白了把,Function 的 prototype 为什么是函数对象了吧?回忆一下函数对象的定义吧!

指针 proto 思考题解答

思考一下,var obj={}; obj.prototype. proto 指向谁?


这里分步思考: 1, obj 只是一个普通对象 2, 什么类型的对象是有 prototype 属性的?当然是函数对象 3, 所以 obj 是没有 prototype 属性的 4, 所以 obj.prototype===undefined 5, 所以此题的最终问题是:undefined.proto 指向什么 6, 所有的对象 obj 都具有 proto 属性(null 和 undefined 除外)!所以答案是 js 报错(有没有一种被我坑了的感觉)

构造器 constructor 思考题解答

思考:a.prototype. proto .constructor 指向谁?


function a(){};
复制代码


这里继续分解题目: 1, a.prototype 指向 a 的一个实例,我们已经多次强调了,而且属于普通对象 2, proto 定义为:指向创造 obj 对象的函数对象的 prototype 属性,所以看下谁创造了 a.prototype,因为 a.prototype 是普通对象,类型为 object,那么是 Object 创造了它, 3, 那么显而易见 a.prototype. proto 指向了 Object.prototype 4, 那么题目简化为 Object.prototype.constructor 指向谁 5, 继续分解题目,Object.prototype 为基本对象,那么就是 Object 创造了它,那么它的 constructor 就指向了 Object


Object.prototype.constructor===Object //true
复制代码


不知道你晕不晕,我有点晕,这产生了蛋生鸡还是鸡生蛋的问题啦~


放心,还是有尽头的 :


Object.prototype.__proto__===null //true
复制代码


这个例子告诉我们是 是 null 创造了一切,这不就是易经中的:“道生一,一生二,二生三,三生万物!”


作者介绍


宜信技术学院 刘晓敏


本文转载自宜信技术学院。


原文链接


彻底深刻理解js原型链之prototype,proto以及constructor(一)


2020-10-17 14:002258

评论

发布
暂无评论
  • js 进阶手写常见函数

    无论是学习react还是vue,它们都是js的应用框架。剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜

    2022-10-31

  • js 函数式编程讲解

    是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。

    2022-10-03

  • js 对象和原型、原型链的关系

    JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个概念一知半解,碰到问题靠“猜”,却不理解它的规则!

    2022-10-21

  • 10|JS 有哪 8 种数据类型,你需要注意什么?

    通过不同类型在实际应用时会出现的各种问题,进一步了解它们的原理和使用方法

    2022-10-11

  • js 函数柯里化 - 面试手写版

    用我自己的话来总结一下,函数柯里化的意思就是你可以一次传很多参数给curry函数,也可以分多次传递,curry函数每次都会返回一个函数去处理剩下的参数,一直到返回最后的结果。

    2022-10-17

  • 聊聊前端面试中的 js 同步与异步问题

    我本来是打算写一篇co源码精读(为啥读co,因为它短),然鹅发现自己存在一系列基础问题没有搞透彻,打算写一个js基础系列文章,总结自己的理解(copy),希望与你在学习路上一同进步。首先问问自己当面试官问到js中的同步和异步,这个问题该怎么回答?理解一个问

    2022-10-06

  • 从这两道题重新理解,JS 的 this、作用域、闭包、对象

    日常开发中,我们经常用到this。例如用Jquery绑定事件时,this指向触发事件的DOM元素;编写Vue、React组件时,this指向组件本身。对于新手来说,常会用一种意会的感觉去判断this的指向。以至于当遇到复杂的函数调用时,就分不清this的真正指向。

    2023-02-19

  • 深入理解对象的私有和静态属性

    深入了解JavaScript的对象构建和面向对象的编程模式。

    2022-10-04

  • js 进阶手写常见函数

    无论是学习react还是vue,它们都是js的应用框架。剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜

    2022-10-03

  • 09|面向对象:通过词法作用域和调用点理解 this 绑定

    学习this的绑定,一个和函数式中的closure有着同等重要性的概念。

    2022-10-08

  • 函数式 vs. 面向对象:响应未知和不确定

    我会先带你从“思维大厦”的顶层开始,来了解JavaScript语言的核心思想,然后再带你看看如何因地制宜地使用这两种编程模式。这样你在日后面对已知和未知问题,做复杂系统开发的时候,也能找到一套行之有效的方法了。

    2022-09-19

  • 30|JavaScript 引擎:双向通讯底层原理是什么?

    双向通讯底层原理是什么?

    2022-11-01

  • js 函数式编程讲解

    是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。

    2022-11-15

  • 问:React 的 useState 和 setState 到底是同步还是异步呢?

    先来思考一个老生常谈的问题,setState是同步还是异步?

    2023-02-14

  • 这些 js 原型及原型链面试题你能做对几道

    在面试过程中,频频被原型相关知识问住,每次回答都支支吾吾。后来有家非常心仪的公司,在二面时,果不其然,又问原型了!

    2022-10-02

  • JS 事件,你真的懂吗(捕获,冒泡)?

    说到js事件大家肯定都知道,那么今天讲一点大家不知道的(假设大家不知道🐶)。所有的js事件都会分为两个阶段捕获和冒泡。那么问题来了,我们通常看到的事件都是直接触发之后就执行了,那么我们怎么才能看到事件的捕获和冒泡都是怎么进行的呢,这里给大家准备

    2022-10-22

  • 从这两道题重新理解,JS 的 this、作用域、闭包、对象

    日常开发中,我们经常用到this。例如用Jquery绑定事件时,this指向触发事件的DOM元素;编写Vue、React组件时,this指向组件本身。对于新手来说,常会用一种意会的感觉去判断this的指向。以至于当遇到复杂的函数调用时,就分不清this的真正指向。

    2023-01-02

  • 08|深入理解继承、Delegation 和组合

    通过JavaScript做到代码复用的几种核心思想和方法。

    2022-10-06

  • js 函数式编程讲解

    是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。

    2022-10-27

  • JS 事件,你真的懂吗(捕获,冒泡)?

    所有的js事件都会分为两个阶段捕获和冒泡。那么问题来了,我们通常看到的事件都是直接触发之后就执行了,那么我们怎么才能看到事件的捕获和冒泡都是怎么进行的呢

    2022-10-28

发现更多内容

WorkPlus Meet提供高效、安全视频会议解决方案

WorkPlus

快速掌握AI测试开发技能,获得更好的职业机会和晋升空间

霍格沃兹测试开发学社

鸿蒙的跨端技术实践方案

Geek_2305a8

AutoCAD 2019(cad2019)汉化激活版下载附cad产品密钥

Rose

cad2019 AutoCAD 2019

Pandora飙升背后的ERC404 目前适合布局吗

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

客户说|从4小时到15分钟,一次分布式数据库的丝滑体验

阿里云瑶池数据库

数据库 云计算 阿里云 云原生 polarDB

macos big sur 软件icons图标大全(新增至2719枚大苏尔风格图标)

Rose

macOS Big Sur icons图标

人工智能测试开发训练营,快速掌握AI测试,更好职业机会晋升空间

测试人

软件测试 测试开发

WorkPlus即时通讯平台,让沟通变得简单高效

WorkPlus

亮点功能:流水线编辑支持并行了!

都广科技

DevOps

软件测试学习笔记丨Allure2测试用例描述相关用法(测试报告类别划分、名字展示等)

测试人

软件测试

人工智能测试开发训练营 带你快速掌握AI测试开发技能,获得更好的职业机会和晋升空间

测吧(北京)科技有限公司

测试

WorkPlus移动应用平台,完美的移动化办公体验

WorkPlus

WorkPlus即时通讯平台,让沟通变得简单高效

WorkPlus

『Java 语法基础』面向对象有哪些特性

EquatorCoco

Java JVM 语法 开发语言

Touch bar pet for Mac(在macbook上养一只宠物)

Rose

Mac软件 电子宠物 touchbar 宠物桌面

Java面试必考题之线程的生命周期,结合源码,透彻讲解!

不在线第一只蜗牛

Java 面试 生命周期 开发语言

如何通过相对规模来估算用户故事?

敏捷开发

Scrum 敏捷 极限编程 用户故事 敏捷团队

软件测试学习笔记丨接口测试面试题

测试人

软件测试 面试题 测试开发

Digital Realty 在日本 NRT 园区设立第二座数据中心

财见

WorkPlus助力企业构建高效内部通讯与协作平台

WorkPlus

毫末贺翔:DriveGPT让通用感知实现“万物识别”、通用认知具备“世界知识”

Geek_2d6073

汽车软件市场迅猛扩张,Perforce Helix Core与Helix IPLM助力汽车软件开发的版本控制及IP生命周期管理

龙智—DevSecOps解决方案

汽车 汽车软件

WorkPlus Meet提供高度安全的私有化会议解决方案,保护企业隐私

WorkPlus

10 个解放双手的 IDEA插件,少些冤枉代码(第三弹)

程序员小富

IDEA 插件

pd18虚拟机如何安装?哪里有Parallels 工具箱?

Rose

PD18虚拟机破解 Parallels 工具箱 Mac虚拟机安装 Parallels Desktop破解

全球视角, 本土行动 —— 本地化商品管理之道

第七在线

Maple 2024 mac下载(含maple注册文件及破解工具)兼容m芯片

Rose

软件下载 Maple 2024 Maple数学软件 Maple 2024 mac破解

大咖公开课 | 探索AI的边界:如何精准地测试人工智能

测吧(北京)科技有限公司

测试

彻底深刻理解js原型链之prototype,proto以及constructor(一)_编程语言_刘晓敏_InfoQ精选文章