javascript中有关对call()、apply()和bind()的一些知情

if (typeof(this.onchange) == “function”)
{
    this.onchange();
}

①实现数组最大最小的一项  

学生类本来不具备任何方法,但是在Person.apply(this,arguments)后,

p1、p2 参数会自动传送到 onload 中。

最开始对于这三者的概念不是很理解,通过查阅资料总算有点理解了,所以在这里记录一下,有什么不对的地方欢迎指出。

除此之外,还有种方法,就是:Function.apply(当然使用Function.call也是可以的)

正在开发中的 ezj
新版本提供了此问题的解决方案。

2
区别:call()和apply()的意思是一样的,不同的是参数列表不一样,call的第二部分参数要一个一个传,apply要把这些参数放到数组中。这就是他们的区别。

 

Function.run(this.onclick, p1);
Function.run(this.onload, p1, p2);

就是这段代码,纠正了我长久以来的一个误区。下面来讲一下这段代码

我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。

说明

function a(){};

 

p1 参数会自动传送到 onclick 中;

Array.prototype.slice.call(arguments);

    obj:这个对象将代替Function类里this对象

使用方法变成了:Function.run(this.onchange)。Function.run
的亮点就是可以运行不确定参数的 JavaScript 函数,比如:

a.prototype.testThis = function(){console.log(a.prototype == this);};

这样写麻烦而且低效。如果用 apply呢,看代码:
function getMax2(arr){
    return Math.max.apply(null,arr);
}
两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。

Function.is = function(v)
{
    return Object.prototype.toString.apply(v) === “[object
Function]”;
}
 
 
Function.run = function(v)
{
    if (Function.is(v))
    {
        var arr = new Array();
        for (var i = 1; i < arguments.length; i++)
        {
            arr.push(arguments[i]);
        }
        v.apply(window, arr);
    }
}

例如:Function.apply(obj,args)可以说是在obj里面去执行Function里面的内容。也就是Function的执行主体变成了obj,改变函数的执行上下文(this的值)。

Function.apply()在提升程序性能方面的技巧

以上代码只是 ezj 新版本的草稿代码,不代表 ezj 新版本发布时的最终代码。

这里面var self =
this这段代码让我很困扰,按理说,prototype是一个对象,对象的this应该指向对象本身,也就是prototype,但真的是这样吗。看看下面的代码:

自从有了Apply,事情就变得如此简单
Array.prototype.push.apply(arr1,arr2)

没什么技术含量,只是,如果有很多属性,都要这样去写,就有些麻烦。

}

apply方法能劫持另外一个对象的方法,继承另外一个对象的属性

相关阅读


再比如数组的push方法。
var arr1=[1,3,4];
var arr2=[3,4,5];
如果我们要把
arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]
arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]

其实这段代码的意思是,如果属性 onchange
对应了一个函数,那么就执行这个函数。因为 onchange
有点像事件的用法,类使用者不一定会为其赋值,所以这里需要判断。

       arr2.unshift(2, 0);

 

  • call 与 apply
    的使用

首先,我们判断是否存在bind方法,然后,若不存在,向Function对象的原型中添加自定义的bind方法。

function getMax(arr){
    var arrLen=arr.length;
    for(var i=0,ret=arr[0];i<arrLen;i++){
        ret=Math.max(ret,arr[i]);       
    }
    return ret;
}

很多情况下,特别是在使用类时,我们常用到类似下面的代码:

但由于ie6~ie8不支持该方法,所以若想在这几个浏览器中使用,我们就要模拟该方法,这也是面试常考的问题,模拟的代码如下:

 

}

在Print.apply(this,arguments)后就自动得到了show()方法

apply的一点小扩展:

<script> 
function Person(name,age){   //定义一个类,人类  
    this.name=name;     //名字  
    this.age=age;       //年龄 
    this.sayhello=function(){alert("hello")};

function Print(){            //显示类的属性 
    this.funcName="Print"; 
    this.show=function(){      
        var msg=[];
        for(var key in this){ 
            if(typeof(this[key])!="function"){
                msg.push([key,":",this[key]].join(""));
            }
        } 
        alert(msg.join(" "));
    };

function Student(name,age,grade,school){    //学生类 
    Person.apply(this,arguments);
    Print.apply(this,arguments);
    this.grade=grade;                //年级 
    this.school=school;                 //学校 

var p1=new Person("jake",10);
p1.sayhello();
var s1=new Student("tom",13,6,"清华小学");
s1.show();
s1.sayhello();
alert(s1.funcName);
</script>

他就具备了Person类的sayhello方法和所有属性。

发表评论

电子邮件地址不会被公开。 必填项已用*标注