当前位置: 首页 > news >正文

【js面试题】new操作做了什么?

这些年也面试了一些外包同事,不知道其他面试官的想法,但就我而言,我更喜欢听到的是口述代码的方式:

比如下述代码

function Animal(age) {
    this.age = age; // 设置新对象的属性
}

const cat = new Animal("8");

最有效的回答就是把如下的代码跟面试官口述一下:

// 相当于:
  /*
  1. const cat = {};
  2. cat.__proto__ = Animal.prototype;
  3. Animal.call(cat, "8");
  4. 返回 cat
  */
console.log(cat.age); // "8"

在这里插入图片描述

主要做了什么呢:

  1. new Animal(“8”) 创建了一个空对象 {}。
  2. 把这个空对象的“内部指针”指向 Animal.prototype(这就是 proto 的作用)。
  3. 把 this 绑定到这个新对象上,执行函数体(给对象加了 age 属性)。
  4. 返回这个新对象,赋值给 cat

那么__proto__和prototype有什么区别

  1. prototype是函数都会有的一个属性(对象),它包含了通过这个构造函数创建的实例可以拥有的属性和方法,new对象时,新对象的__proto__(原型)会指向Animal(构造函数)的prototype。
  2. proto__是对象(普通对象、数组、函数等)的一个隐藏属性,它指向了Animal(构造函数)的prototype(原型对象),如:访问cat对象时,如果某个属性找不到,它就会沿着__proto,去找Animal.prototype。

call如何理解

  1. call()、apply()、bind() 都是用来重定义 this 这个对象的
  2. call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔;bind 除了返回是函数以外,它 的参数和 call 一样;apply 的所有参数都必须放在一个数组里面传进去
const obj = {
	name: 'cat',
	age: this.age,
	fun: function(fromCity, toCity) {
		console.log(this.name + this.age, fromCity, toCity)
	}
}
const toThis = {
	name: 'dog',
	age: 18
}
obj.fun.call(toThis,'深圳','南通') // dog18 深圳 南通
obj.fun.apply(toThis,['深圳','南通']) // dog18 深圳 南通 
obj.fun.bind(toThis,'深圳','南通')() // dog18 深圳 南通 

在这里插入图片描述

原型链和this指向是老生常谈的知识点,反复看更容易记忆。

相关文章:

  • # 爬虫技术的实现
  • 2747. 统计没有收到请求的服务器数目
  • 7-openwrt-one通过web页面配置访客网络、无线中继等功能
  • OLAP与OLTP架构设计原理对比
  • Java学习手册:Java发展历史与版本特性
  • 开源的7B参数OCR视觉大模型:RolmOCR
  • 抖音视频下载工具
  • 数据质量问题中,数据及时性怎么保证?如何有深度体系化回答!
  • 力扣刷题——3319.第k大的完美二叉子树的大小
  • Huber Loss:线性回归的“抗干扰神器”
  • 图片中文字无法正确显示的解决方案
  • 在 Cursor 中手动安装旧版 C/C++ 扩展的解决方案
  • 编译freecad
  • MySQL运行一段时间后磁盘出现100%读写
  • 《C语言中的“魔法盒子”:自定义函数的奇妙之旅》
  • python调用本地部署的大模型(llama3.2)
  • 以文件树的形式展示目标文件夹
  • 用Django和AJAX创建一个待办事项应用
  • 蓝桥杯2022年第十三届省赛真题-求阶乘
  • Web Worker