手写实现

93 阅读1分钟

call

主要让绑定对象新增属性指向原函数,然后利用隐式绑定。记得删除辅助属性。 image.png

Function.prototype.call = function() {

    let [targetObj, ...args] = [...arguments];

    targetObj.func = this;

    let res = targetObj.func(...args);

    delete targetObj.func;

    return res;

}

bind

image.png

Function.prototype.bind = function () {

    let [targetObj, ...args] = [...arguments];

    let that = this

    let bindedFunction = () => this.apply(targetObj, args)

    return bindedFunction

}

Promise.all

image.png image.png

Promise.all = fuction(promisesArr) {

    return new Promise((resolve, reject) => {

        if (!promisesArr.length) return resolve([])

        let resArr = [], alreadyFullfill = 0

        for (let [i, p] of promisesArr.entries()) {
            Promise.resolve(p).then(res => {

                resArr[i] = res

                alreadyFullfill++

                if (alreadyFullfill === promisesArr.length) return resolve(resArr)

            }, err => {

                return reject(err)

            })

        }

    })

}

Promise.race

image.png

Promise.race = function(promisesArr) {

    return new Promise((resolve, reject) => {

        for (let [i, prom] of promisesArr.entries()) {

            Promise.resolve(prom).then(res => {

                return resolve(res)

            }, err => {

                return reject(err)

            })

        }

    })

}

catch、resolve、reject

image.png

curry

image.png

function curry(func) {

    return function curriedFunc(...args) {

    if (args.length < func.length) {

        return funtion() {

            return curriedFunc(...args.concat(Array.from(arguments)))

        }

    }

    return func(...args)

    }

}

deepCopy 考虑循环引用

image.png

function deepCopy(obj, map = new WeakMap()) {

    if (obj === null || typeOf obj !== 'object') {

        return obj

    }

    if (map.has(obj)) {

        return map.get(obj)

    }

    let target = new obj.constructor()

    for (let key in obj) {

        if (obj.hasOwnProperty(key)) {
            target[key] = deepCopy(obj[key], map)

        }

    }
    map.set(obj, target)

    return target

}

debounce、throttle

function debounce(func, ms = 300) {
    let time = 0
    return function() {
        if (Date.now() - time > ms) { 
            time = Date.now()
            return func(...Array.from(arguments))
        }
        time = Date.now()
    }
}

function throttle(func, ms = 300) {
    let time = 0
    return function() {
        if (Date.now() - time > ms) {
            time = Date.now()
            return func(...Array.from(arguments))
        }
   }
}