js一些面试题

139 阅读1分钟

1.手写call

call

let  parent =  {
    add: function(a, b) {
        return a+b
    }
}
let obj = {}
Object.prototype.Mycall = function (obj) {
    // 判断parent.add是否为函数
    if (typeof this !== 'function') {
        console.log("type error")
        return 
    }
    // 是否传入目标对象
    let context = obj || window
    // 目标对象添加一个与本对象不重复的属性
    let key = Symbol()
    //将parent.add赋值给目标对象的属性
    context[key] = this 
    // 取参数
    let arg = [...arguments].slice(1)
    //执行函数
    let result = context[key](...arg)
    delete context[key]
    return result
}
console.log(parent.add.Mycall(obj, 1, 2))

2.手写appy

let  parent =  {
    add: function(a, b) {
        return a+b
    }
}
let obj = {}
Object.prototype.MyApply = function (obj) {
    // 判断parent.add是否为函数
    if (typeof this !== 'function') {
        console.log("type error")
        return 
    }
    // 是否传入目标对象
    let context = obj || window
    // 目标对象添加一个与本对象不重复的属性
    let key = Symbol()
    //将parent.add赋值给目标对象的属性
    context[key] = this 

    //执行函数,与call的区别在于传参
    let result
    if (arguments[1]) {
        result = context[key](...arguments[1])
    } else {
        result = context[key]()
    }
    delete context[key]
    return result
}
console.log(parent.add.MyApply(obj, [1, 2]))

3.手写bind