JS进阶:
1.bind,call,apply区别:
call和apply都是为了改变this的指向。作用都是相同的,只是传参的方式不同。
除了第一个参数外,call可以接收一个参数列表,apply只能接收一个参数数组。
let a = {
value: 1
}
function getValue(name,age){
console.log(name)
console.log(age)
console.log(this.value)
}
getValue.call(a,'clancy','21')
getValue.apply(a,['clancy','21'])
bind和其他两个方法作用也是一致的,只是该方法会返回一个函数。并且我们可以通过bind实现柯里化。
2.原型和原型链:
原型:
(1)所有引用类型都有一个_proto_(隐式原型)属性,类似于链表中的next指针,链表可以通过.next访问下个元素,原型中可以通过._proto_访问上一级元素。
(2)所有类都有一个ptototype(原型)属性,例如:Object,Array,Function
(3)所有引用类型的_proto_属性指向它构造函数的prototype 例如:arr是一个数组实例,那么arr._proto_=Array.prototype
原型链:
当访问一个对象的某个属性时,会先在这个对象本身上查找,如果没有找到,则会去它的_proto_上找,即它构造函数的prototype,如果没有找到就会继续在构造函数prototype的_proto_中找,这样一层一层向上查找就会形成一个链式结构,我们成为原型链。
例如:
arr为Array的一个实例
arr._proto_=Array.prototype
Array._proto_=Object.prototype
arr._proto_._proto_=Object.prototype
面试题:instanceof的原理,并用代码实现
分析:如果A沿着原型链能找到B.prototype,那么 A instanceof B为true(用_proto_来找)
解法:遍历A的原型链,如果找到B.prototype,返回true,否则返回false
const instanceof = (A,B) =>{
let p = A
while(p){
if(p===B.prototype){return true}
p=p._proto_
}
return false
}