这些年也面试了一些外包同事,不知道其他面试官的想法,但就我而言,我更喜欢听到的是口述代码的方式:
比如下述代码
function Animal(age) {this.age = age;
}const cat = new Animal("8");
最有效的回答就是把如下的代码跟面试官口述一下:
console.log(cat.age);

主要做了什么呢:
- new Animal(“8”) 创建了一个空对象 {}。
- 把这个空对象的“内部指针”指向 Animal.prototype(这就是 proto 的作用)。
- 把 this 绑定到这个新对象上,执行函数体(给对象加了 age 属性)。
- 返回这个新对象,赋值给 cat
那么__proto__和prototype有什么区别
- prototype是函数都会有的一个属性(对象),它包含了通过这个构造函数创建的实例可以拥有的属性和方法,new对象时,新对象的__proto__(原型)会指向Animal(构造函数)的prototype。
- proto__是对象(普通对象、数组、函数等)的一个隐藏属性,它指向了Animal(构造函数)的prototype(原型对象),如:访问cat对象时,如果某个属性找不到,它就会沿着__proto,去找Animal.prototype。
call如何理解
- call()、apply()、bind() 都是用来重定义 this 这个对象的
- 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,'深圳','南通')
obj.fun.apply(toThis,['深圳','南通'])
obj.fun.bind(toThis,'深圳','南通')()

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