zoukankan      html  css  js  c++  java
  • js-手写call,apply,bind

    function sum(){
        console.log(this.name)
    }
    Function.prototype.mycall=function(myobj,...args){
            if(typeof myobj==='Function'){
                 throw new TypeError('error')
           }
          const  fn=symbol('fn')    //唯一值
          myobj=myobj || window  //若没有传入对象,则绑定到window上
          myobj[fn]=this         //把函数赋值到对象的某个属性
          const result=myobj[fn](...args)
         delete  myobj[fn]       //删除fn声明
         return result
    }
    const obj={
    name:'泪痕'
    }
    sum.mycall(obj) //泪痕
    

     以上就是手动实现call的代码

    function sum(){
       console.log(this.name)
    }
    Function.prototype.myapply=function(myobj,args){
           if(typeOf myobj==='Function'){
                 throw new TypeError('error')
           }
          const  fn=symbol('fn')    //唯一值
          myobj=myobj || window  //若没有传入对象,则绑定到window上
          myobj[fn]=this         //把函数赋值到对象的某个属性
          const result=myobj[fn](...args)
         delete  myobj[fn]       //删除fn声明
         return result
    }
    const obj={
    name:'泪痕'
    }
    sum.myapply(obj,[]) //泪痕

     以上就是实现一个apply的代码

    function sum(name){
     this.name=name
    }
    Function.prototype.mybind=function(myobj,...args){
           if(typeOf myobj==='Function'){
                 throw new TypeError('error')
           }
          let self=this
          let fnNop = function () {} // 定义一个空函数
          let fnBound=function(){
              // 检测 New , 如果当前函数的this指向的是构造函数中的this 则判定为new 操作
               let _this=this instanceof self?this:myobj
               self.apply(_this,args.concat(Array.prototype.slice.call(arguments)))    
          } 
    
        if (this.prototype) {
           fnNop.prototype = this.prototype;
       }
    
       fnBound.prototype = new fnNop();
       return fnBound
    }
    

      

    const obj={}
    let outPut=sum.mybind(obj)
    outPut('图图')
    obj.name//图图
    const outPut1=new outPut('小样')
    obj.name//图图
    outPut1.name//小样
    

      

    以上就是实现bind的的方法

  • 相关阅读:
    使用JRadioButton 示例
    使用JTextArea示例
    python与c语言的区别以及python的小小基础
    Linux常用的服务器构建
    在VMware虚拟机软件中安装的Ubuntu虚拟机的窗口不能自动调整大小的解决办法
    Ubuntu 下环境搭建系列 —— 安装 Google Chrome
    Linux命令复习和练习_03
    Android hybrid App项目构建和部分基本开发问题
    Ionic Framework
    node.js代理设置
  • 原文地址:https://www.cnblogs.com/wmydb/p/12666250.html
Copyright © 2011-2022 走看看