bind方法 一种我们忽略的继承

我们之前说过了call和apply两者的区别仅仅是第二参数的不同,call对的第二个参数 可以是任意字符,apply的第二个参数必须是数组。当然,第二个参数视需求而定,是可选的。

今天本来想写一个放大镜的效果,再找参考资料的时候 无意发现了一个bind方法,看到解释让我甚是感兴趣,改变函数对象内部的this指向。IE8以下不兼容:

"use strict";
        var pi = 99;
        var uk = {
            pi:888,
            app:function(){
                return function(){
                    console.log(this.pi);
                }
            },
            kk:{
                pi:1235
            }
        };
        function uxc(){}
        uxc.prototype = {
            pi:9527
        }
        uk.kk = new uxc;
        var ii = uk.app().bind(uk.kk);
        ii();

打印出来是95278,重点就是这句话起作用了:

uk.kk = new uxc;

改变了kk.pi变成9527;

bind返回的是函数,call和apply返回的是结果。

所以后面我还ii();执行了一下。

不过很多朋友推荐使用call和apply我觉得也是兼容好,而且利索。性能也比bind高。但是有一些情况还是会遇到使用bind的.下面下一个兼容:

if (!Function.prototype.bind) {
    Function.prototype.bind = function(obj) {
        var _self = this
            ,args = arguments;
        return function() {
            _self.apply(obj, Array.prototype.slice.call(args, 1));
        }
    }
}
 _self.apply(obj, Array.prototype.slice.call(args, 1));
最后还是用到了apply和call方法来。
 Array.prototype.slice.call(args, 1) //返回一个空数组.<pre name="code" class="javascript">console.log(Object.prototype.toString.call(Array.prototype.slice.call(arr,0))=="[object Array]");//true apply一下 this就是obj了 接着再返回。
 
 

转载于:https://www.cnblogs.com/junxi/p/5228496.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值