<script type="text/javascript">
        // 手写 call 原理详解
        // 核心,在目标对象中创建函数方法等于执行的函数,然后用目标对象调用此方法(此时this指向目标对象),然后删掉创建的方法,返回结果
        // 使用 call apply bind 的都是函数 所以此方法写在 function 的构造函数 Function 的原型上面
        Function.prototype.mycall = function(content){

            //创建一个变量,这个变量即一个参数传过来的对象, 所以这个变量为一个对象
            const context = content || window
            //此处的 this 为调用 .mycall 的函数,个人觉得,调用 mycall 方法的函数为Function的实例,实例调用原型上的 mycall 此处的 this 则指向实例
            // console.log(this)
            //context对象创建 一个函数方法fn 等于函数实例,也就是调用 mycall 的函数
            context.fn = this
            //此处获取除一个参数以后的所有参数
            const arg = [...arguments].slice(1)
            //在 context 对象中执行 函数实例,调用者为 context 对象
            const res = arg.length ? context.fn(...arg) : context.fn(...arg)
            //为了不影响 context 对象,所以把 context 上挂载的 fn 方法删掉
            delete context.fn
            //返回结果
            return res
        }

        Function.prototype.myApply = function(obj) {
            const context = obj || window
            context.fn = this
            const res = arguments[1] ? context.fn(...arguments[1]) : context.fn()
            delete context.fn
            return res
        }

        const age = 18
        const obj = {
            name:'hong',
            objName : this.age,
            myFn(){
                console.log(this.name)
            }
        }
        const obj1 = {
            name: 'hong1',
            age: 18
        }
        // obj.myFn()
        // obj.myFn.call(obj1)
        // obj.myFn.mycall()
        obj.myFn.myApply(obj1)
    </script>

 

posted on 2020-10-16 22:38  京鸿一瞥  阅读(217)  评论(0编辑  收藏  举报