前端经典面试题解密:JS的new关键字都干了什么?

前言

new关键字在实例化获取对象时都做了什么?是一道经常出现在前端面试时的问题。如果只是简单的了解new关键字是实例化构造函数获取对象,是万万不能够的。更深入的层级发生了什么呢?同时面试官想从这道题里面考察什么呢?下面胡哥为各位小伙伴一一来解密。

一、new关键字

new关键字的作用:通过new关键字实例化构造函数,获取对象。说一千道一万,不如来段代码看一看

// 定义构造函数
function Person (name, age) {
	this.name = name
	this.age = age

	this.say = function () {
		console.log(`my name is ${this.name}, my age is ${this.age}`)
	}
}

// 构造函数的原型属性和方法定义
Person.prototype.color = ‘yellow‘
Person.prototype.sayBye = function () {
	console.log(‘Bye!‘)
}

// 实例化
let p = new Person(‘胡小帅‘, 18)
console.log(p)

// 当前属性
console.log(p.name)
// 当前方法
p.say()
console.log(p.color)
// 原型方法
p.sayBye()

二、伪代码演示过程

通过new关键字实例化的对象p,具备了构造函数Person中this的属性:nameage,也具备了构造函数Person的原型prototype的属性color和方法sayBye。下面我们来通过伪代码来看看具体的实现过程。

  1. 初始化新对象

    var o = {}
    
  2. 原型的执行,确定对象o的原型链
    o.__proto__ = Person.prototype
    
  3. 绑定this对象为o,传入参数;执行Person构造函数,进行属性和方法的赋值操作
    Person.call(o, ‘胡小帅‘, 18)
    
  4. 返回结果

    注意:在通过该种方式获取对象时,最终不一定返回的是对象o,要看构造函数的返回值是什么。

    如果函数返回的是基本类型值,实际会生成一个对象,返回o
    如果是函数返回的是引用类型值,则实际返回的是该引用类型值
    

后记

以上就是胡哥今天给大家分享的内容,喜欢的小伙伴记得收藏转发、点击右下角按钮在看,推荐给更多小伙伴呦,欢迎多多留言交流...

胡哥有话说,一个有技术,有情怀的胡哥!现任京东前端攻城狮一枚。

胡哥有话说,专注于大前端技术领域,分享前端系统架构,框架实现原理,最新最高效的技术实践!

长按扫码关注,更帅更漂亮呦!关注胡哥有话说公众号,可与胡哥继续深入交流呦!

原文地址:https://www.cnblogs.com/justbecoder/p/12657781.html

时间: 2024-11-05 22:44:11

前端经典面试题解密:JS的new关键字都干了什么?的相关文章

前端开发面试题收集 JS

前端开发面试题收集-JS篇 收集经典的前端开发面试题 setTimeout的时间定义为0有什么用? javascript引擎是单线程处理任务的,它把任务放在队列中,不会同步执行,必须在完成一个任务后才开始另一个任务. 由于setTimeout可以把任务从某个队列中跳出成为新队列,因此能够得到期望的结果. 怎么理解this this指向的总是调用函数的那个对象. this一般情况下,是全局对象Global. 什么是闭包 闭包是一个概念,我的理解是函数里的函数,能够读取函数内部变量的函数. 就是将函

Web前端经典面试试题(三)

一. 什么是Ajax??? 术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验. Ajax它是"Asynchronous JavaScript + XML的简写" 定义Ajax: Ajax不是一种技术.实际上,它由几种蓬勃发展的技术以新的强大方式组合而成.Ajax包含: * 基于XHTML和CSS标准的表示: * 使用Document Object Model进行动态显示和交互: * 使用XMLHttpRequest与服务器进行异步通信: * 使用JavaScri

【前端经典面试题】前后端分离(说一说你理解的前后端分离?)

前言:昨晚面试遇到了这个问题,既然遇到了,找些资料来一起做个总结吧. 1.对前后端分离的误解  在回答这个问题的时候不要钻到某个具体的技术 ,或者某个具体的框架上面→比如ajax异步请求.vue或react等组件化的开发框架.再或者rest接口规范.API接口数据约定等.从某个具体的技术切入来回答对前后端分离的理解本身就是一种局限的看法,所以在回答这个问题的时候应该从以下几个方面展开. 2.为什么要分离?  在以往的很长一段时间里,后端开发才是开发团队里的核心,前端开发往往仅由一小撮人甚至交给后

前端开发面试题收集(js部分)

1.问:js中"1"+2+"3"+4 运算结果是? 答:1234 js中,字符串和数值相加,得到的还是字符串,这里的结果1234也是字符串. 2.问:4+3+2+"1"  运算结果是? 答:91 (从左至右的运算,前面是数值相加得到9,再和字符串相加得到91字符串.) 3.问:以下代码中,结果是? var foo = 1; function bar() { foo = 10; return; function foo() {} } bar();

淘宝网前端开发面试题(二)--JS 面试题

转载请注明文章来源http://www.cnblogs.com/muqiangwei/p/5570470.html 所有答案仅供参考,不负责答案对错(^_^) 1.js 是什么,js 和 html 的开发如何结合? js是javascript的缩写,是一种基于对象的.事件驱动的脚本语言.它一共由三个部分组成:分别是DOM,BOM,ECMAscript.HTML 是超文本标记语言.HTML里的每一个标签就是JS里面的DOM节点.JS操作DOM节点就是在操作HTML的标签. 2.怎样添加.删除.复制

微信牛牛平台日租搭建技巧 web前端经典面试题如何应对

一.javascript 基础(es5) 1.原型:这里可以谈很多,只要围绕 [[ prototype ]] 谈,都没啥问题2.闭包:牵扯作用域,可以两者联系起来一起谈3.作用域:词法作用域,动态作用域(微信牛牛平台日租搭建Q-2189563389 代码<?13182926751>)4.this:不同情况的调用,this 指向分别如何.顺带可以提一下 es6 中箭头函数没有 this, arguments, super 等,这些只依赖包含箭头函数最接近的函数5.call,apply,bind

前端经典面试题:如何理解 HTML 语义化?

本文最初于 2018-09-21 发布于 知乎 ,后在 <重学前端> 专栏的学习中,重新复习整理,发布于 Github 上,并计划写一系列前端学习相关的文章.欢迎 star . HTML 语义化 简单来说,我们可以理解为:用正确的标签做正确的事情. 例如: 段落用 p 标签,标题用 h 系列标签,边栏用 aside 标签,主要内容用 main 标签.正确使用语义标签可以带来很多好处. 为什么要关注 HTML 语义化?(为什么要使用语义类标签?) 对人: 增强可读性,对开发者更友好,在没有 CS

前端经典面试题-代码

1.检测变量类型. // 此方法不仅可检测出6种基本数据类型,还能检测出Array.Function Object.prototype.toString.call(Array) // ['Object','Array'] 2.去除字符串中的空格,可使用trim()方法或正则表达式. // trim()用于去除字符串左右两端的所有空格 // trimLeft().trimRight()用于去除字符串左边和右边的空格 ' today is Monday '.trim() // "today is M

前端经典面试题

1.请说出==和===的区别? 答:== 判断内容是否相等 不比较类型 console.log (1 == "1") ;  true ===判断内容相等  且类型也相等 console.log (1 === "1") ;  false 2.行级元素有哪些?块级元素有哪些?行级元素如何转换成块级元素? 块级元素:div, dl, form, h1, h2, h3, h4, h5, h6, hr, p, ul, table 行内元素:br, em, i, img, in