JS的原型和原型链算是前端面试题的热门题目了,也是参加了几场面试,感觉好多次都被问到对原型和原型链的理解,所以今天也是索性把他给整理出来,一方面方便自己以后复习查看,另一方面也是给大家分享一下我对原型和原型链的理解。

ES6之前中并没有引入类(class)的概念,JavaScript并非通过类而是直接通过构造函数来创建实例。

什么是原型

每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性。

这么说可能会有点抽象,举个例子吧

function Person(age) {this.age = age
}
Person.prototype.name = 'kavin'
var person1 = new Person()
console.log(person1.name)  //kavin

就是说在通过构造函数创建实例的时候,如果去实例中找寻某个属性值的时候,如果他有的话就会直接输出,如果没有的话,就会去它的原型对象中去找。

prototype:每个函数都有一个prototype属性,这个属性指向函数的原型对象。

__proto__:这是每个对象(除null外)都会有的属性,叫做__proto__,这个属性会指向该对象的原型。

constructor:每个原型都有一个constructor属性,指向该关联的构造函数。

原型相关的知识考点一般就是围绕这张图,那怎么去验证这张图的正确性呢?

console.log(Person===Person.prototype.constructor)  // true
console.log(person.__proto__ == Person.prototype) // true
console.log(person.__proto__.constructor == Person) // true
console.log(person.constructor == Person) // true

估计大家看到底四个的时候会有一些疑问了,为什么person.constructor == Person,其实还是前面所说到的,因为person没有这个属性的情况下,会从它的原型中去继承,这个时候第三个式子和第四个式子就是一样的了。

什么时候会用到原型

下面说一下什么时候会用到原型,还是像上边一样,举个简单的例子:

function Person(name, age, gender) {this.name = namethis.age = agethis.gender = genderthis.sayName = function () {console.log("我的名字叫" + this.name);}}

这和上边看起来是没什么区别的,但是小差别就在这个sayName ,就是说每创建一个Person构造函数,在Person构造函数中,为每一个对象都添加了一个sayName方法,也就是说构造函数每执行一次就会创建一个新的sayName方法。

一个还好,如果创建了一百个实例,一千个甚至上万个呢,这时候就体现出原型的好处了,我们可以把sayName方法放到构造函数的prototype上,这时候只需要创建一个,而且每一个实例都可以访问到。

什么是原型链

单的回顾一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。

简单的表达就是:上边说道如果实例没有一个属性,它会去它的原型中去找,但是如果它的原型中也没有这个属性呢,会停止寻找么,不一定,因为它的原型可能也有自己的原型,这个时候他就会去它的原型的原型中去寻找,这个时候会停下么,还是不一定,要看他原型的原型有没有原型,这样就形成了一条原型链。

直到最后一个找不到原型时返回null

前端面试题:JS中的原型和原型链相关推荐

  1. 2023前端面试题------JS 面试题(2) es6

    2023前端面试题------es6 面试题 三. JS高频面试题 15. 事件循环 16. 微任务和宏任务 17. http相关 18. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生 ...

  2. 初级前端面试题 - js

    前言:众所周知,HTML,CSS,JS是学习前端所必备的.js的基础学好了,框架类的vue,react等都会接受的很快,因此js是前端很总要的一个部分,这篇文章将会结合面试题,对js的知识点进行总结 ...

  3. 前端面试题js篇,持续更新

    1.解释重绘与回流,以及如何优化? 重绘与回流:   在页面加载时,浏览器会把获取到的html代码解析成dom树,dom树中包含html所有标签以及js动态生成的元素等.浏览器会把所有的样式(即css ...

  4. 2023前端面试题——JS篇

    1.判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 ' ...

  5. 前端面试题 Vue 中的 生命函数(钩子函数)

    目录 一,生命周期(钩子函数) 的简介 二,四类钩子函数的 触发条件 及 使用方法 钩子函数声明的位置: 1. Lifecycle-初始化 beforeCreate 和 created 2.Lifec ...

  6. 前端面试题——js闭包

    什么是闭包?以下代码点击<p> 会输出什么?为什么?能大概说明白的话继续问能想出几种解决办法. ========== 出错:获取HTML元素集合,循环给元素添加事件.在事件响应函数中(ev ...

  7. 前端面试题 - HTML 中的长度单位

    单位 在使用不同类型描述长度值时,需要附加单位.不同的单位表示的含义是不同的 在 CSS 中具有 2 种不同类型的长度单位: 绝对长度单位 相对长度单位 绝对长度单位 所描述的长度任何其他因素是无关的 ...

  8. 前端面试题 - JS 运算符优先级

    建议先看一下运算符分类,可以参考这篇文章:js运算符与优先级,基本上把所有的运算符以及分类都总结了出来. 借用文章的一个表格,该表格包含了所有的运算符,优先级自上而下逐渐降低,同一行优先级相同: 我们 ...

  9. 详细前端面试题javascript篇--持续更新

    最新前端面试题汇总大全(超详细含vue,react,css,js,webpack,性能优化等)–持续更新点击查看 前端HTML篇 前端CSS篇 前端面试题js篇--持续更新 1. JS 数据类型 ?存 ...

  10. 腾讯云前端面试题及答案

    腾讯云前端面试题 js数据类型 js语言特性 闭包产生的原因 CSS盒模型 行内元素和块级元素区别 重排和重绘 事件的捕获和冒泡,冒泡的使用场景 cookie,localstorage,session ...

最新文章

  1. Python20-Day05
  2. 文件处理命令:sed
  3. 四种软件架构演进史,会一种就很牛逼了!
  4. 型热电偶阻值温度对照表_如何选用温度传感器
  5. 2018-2019 20165232 Exp5 MSF基础应用
  6. 两万字详解MongoDB从入门到精通
  7. 《跟我学Shiro》——张开涛(链接)
  8. 好用的滚动式截图工具picpick
  9. ArcGIS网络分析扩展模块
  10. Python利用selenium实现自动登录网页qq
  11. Android手机视频监控系统
  12. HBuilderX运行到手机或模拟器提示没有找到设备
  13. 双十一报告(B站平台)|品牌、UP主内容营销如何实现共赢?
  14. 三维动画渲染用什么软件好?
  15. 国科大-高性能计算考试
  16. 力天创见Brickstream排队客流统计
  17. 一个显示器分屏显示两个画面_测了两个爆款游戏显示器,结果我发现他们都有坑...
  18. Blender入门级使用
  19. ZOJ 3964 NIM变形
  20. 《天河传说》详细攻略1

热门文章

  1. CNC模具加工工艺与编程要点
  2. 计算机科学与技术专业规化,计算机科学与技术专业认识与规划
  3. 物联网之配置阿里云生活物联网平台
  4. 英飞凌TC264D单片机——匿名上位机蓝牙串口发送通信协议
  5. Android通过蓝牙获取通讯录
  6. Vue CLI和Vite
  7. python+pycharm+mysql+sqlyog下载安装
  8. finecms前台任意文件上传——getshell
  9. 联网游戏怎样修改服务器,Kaillera—-游戏联网服务器搭建
  10. 光纤滑环-光纤旋转连接器的最新发展及应用