【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指向是老生常谈的知识点,反复看更容易记忆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值