写点什么

彻底深刻理解 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:002429

评论

发布
暂无评论
  • 函数式 vs. 面向对象:响应未知和不确定

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

    2022-09-19

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

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

    2022-10-08

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

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

    2022-10-28

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

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

    2023-01-02

  • js 函数式编程讲解

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

    2022-11-15

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

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

    2022-10-17

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

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

    2022-11-01

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

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

    2022-10-06

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

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

    2023-02-19

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

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

    2022-10-06

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

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

    2023-02-14

  • js 函数式编程讲解

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

    2022-10-03

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

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

    2022-10-22

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

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

    2022-10-04

  • js 函数式编程讲解

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

    2022-10-27

  • js 进阶手写常见函数

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

    2022-10-31

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

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

    2022-10-21

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

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

    2022-10-11

  • js 进阶手写常见函数

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

    2022-10-03

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

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

    2022-10-02

发现更多内容

工信部电子标准院:龙蜥操作系统获评“优秀”

OpenAnolis小助手

工信部 开源项目 获奖 龙蜥操作系统 生态构建

复习前端:JavaScript V8 引擎机制

devpoint

chrome JIT V8

技术管理者如何获得下属的认同?

石云升

极客时间 1月月更 技术领导力实战笔记

Kratos微服务框架API工程化指南

golang gRPC microservice Kratos 工程化

水果软件2024FL Studio中文语言版本下载

茶色酒

FL Studio FL Studio 21

CleanMyMac X2024汉化版安装包新增

茶色酒

CleanMyMac X CleanMyMac X2023

架构误区系列11:无聊的架构归一

agnostic

架构治理

2022年终总结-无所吊谓

wood

年终总结 稳定 开心 普通的一年

复习前端:前端应掌握的网络知识

devpoint

OSI七层协议 http2 HTTPS协议加密

开源移动核心网Magma架构设计启示

俞凡

架构 网络 通信

WSL中使用vcpkg安装pcl库出现编译失败的原因

大伟

Studio One2024旗舰级DAW的跨版本升级

茶色酒

Studio One 5 Studio One2023

你知道哈希算法,但你知道一致性哈希吗?

JAVA旭阳

Java 架构

JSON.stringify() 的 5 使用场景

devpoint

JavaScript 前端开发 JSON格式化

【Java应用服务体系】「序章入门」全方位盘点和总结调优技术专题指南

洛神灬殇

Java 技术分析 应用调优 优化指南

复习前端:前端安全

devpoint

CSRF xss攻击 前端安全

如何快速优雅的用Know Streaming创建Topic

石臻臻的杂货铺

获取 topic等信息 后端、

工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践

JAVA旭阳

Java 架构

CleanMyMacX4.12.2最新版本更新下载

茶色酒

CleanMyMacX

关于环境变量配置的思考总结

timerring

Go 环境变量

Portraiture2024汉化版磨皮插件下载

茶色酒

Portraiture2023 Portraiture

技术如何分担产品之忧?

石云升

极客时间 1月月更 技术领导力实战笔记

Python 内置界面开发框架 Tkinter入门篇 甲

eng八戒

Python GUI tkinter

精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

洛神灬殇

Java JVM JVM原理 2023

Best Wishes「兔」You!

阿里云视频云

【Linux技术专题系列】「必备基础知识」一起探索和实践sftp配置之密钥方式登录

洛神灬殇

Linux SSH SSH工具 sftp

极客时间运维进阶训练营第十二周作业

9527

【PHP】英文博客专栏PHP快速入门个人笔记

懒时小窝

php

从员工批量离职中,认识管理的价值

石云升

极客时间 1月月更 技术领导力实战笔记

架构误区系列12:一切皆依赖云平台

agnostic

云计算 部署架构

万字长文搞懂产品模式和项目模式

俞凡

团队管理

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