手写new-apply-call-bind系列

手写new-apply-call-bind系列

<script>
    function Person(name,age){
        this.name=name;
        this.age=age;
    }
    Person.prototype.sayName=function(){
        console.log(this.name)
    }
    //一、new
    //new 的作用,调用构造函数,创建新对象
    function myNew(...args){
        let constructor = args[0]
        //1. 创建新对象
        var obj = {};
        //2. 将对象的原型指向构造函数
        //Object.setPrototypeOf(obj,constructor.prototype)
        obj.__proto__=constructor.prototype;
        // 1 2步可以合并这样写:let obj = Object.create(constructor.prototype)
        //3. 对象对象调用构造函数
        constructor.apply(obj,args.slice(1))
        //4. 返回对象
        return obj;
    }
    var person1=myNew(Person,"new",1);
    person1.sayName();

    //二 、call
    //用法:一个函数的方法,接受一个对象和函数要接受的参数,
    var person ={
        name:'person call'
    }
    var name='window'
    function test(...args){
        console.log(this.name)
        return args.length
    }
    Function.prototype.myCall=function(...args){
        var obj= args[0];
        obj.fn = this;
        let result= obj.fn(...(args.slice(1)))
        return result
    }
    console.log(test('call'))
    console.log(test.myCall(person,'call','ca','test'))

    //三、apply
    Function.prototype.myApply=function(obj,args){
        obj.fn = this;
        let result= obj.fn(...args)
        return result;
    }
    console.log(test.myApply(person,["call1","call2"]))

    //四、bind
    //绑定函数的this指向,返回一个函数
    //bind方法接收参数,该参数可以传给调用bind方法的函数

    var bindObj={
        num:1
    }
    function bindTest(a,b){
        this.a=a;
        this.b=b;
        return (a+b+this.num)
    }
    console.log(bindTest.bind(bindObj)(1,2))
    //实现:
    Function.prototype.myBind=function(...args){
        var obj=args[0];
        //console.log(obj)
        obj.fn=this
        console.log(this)
        return function(...args2){
            return obj.fn(...(args.slice(1)),...args2)
        }
    }
    console.log(bindTest.myBind(bindObj,2,7)())


</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值