手写 call
Function.prototype.mycall = function (ctx, ...args) {
ctx = ctx === undefined || ctx === null ? globalThis : Object(ctx)
// ctx 一定是对象
const fn = this // 待执行的函数
const key = Symbol('temp')
Object.defineProperty(ctx, key, {
enumerable: false,
value: fn,
})
const result = ctx[key](...args)
delete ctx[key]
return result
}
手写 bind
// 只生效一次
function bind(ctx){
return function(){
if(当前函数是使用 new 来调用的){
new 调用原始函数
}else{
原始函数.call(ctx)
}
}
}
Function.prototype.myBind = function (ctx) {
var args = Array.prototype.slice.call(arguments, 1)
var fn = this
return function A(...args) {
var restArgs = Array.prototype.slice.call(arguments)
var allArgs = args.concat(restArgs)
// 使用 new 的方式调用的这个函数
if (Object.getPrototypeOf(this) === A.prototype) {
// return new fn(...allArgs)
var obj = {}
Object.setPrototypeOf(obj, fn.prototype)
fn.apply(obj, allArgs)
return obj
} else {
return fn.apply(ctx, allArgs)
}
}
}
防抖
function debounce(func, duration = 500) {
let timerId
return function (...args) {
clearTimeout(timerId)
timerId = setTimeout(() => {
func.apply(this, args)
}, duration)
}
}
手写 instanceof
instanceof 作用:
判断一个实例是否是其父类或者祖先类型的实例。
instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype查找失败,返回 false
核心要点:原型链的向上查找。
let myInstanceof = (target, origin) => {
while (target) {
if (target.__proto__ === origin.prototype) {
return true
}
target = target.__proto__
}
return false
}