从零开始学_JavaScript_系列(29)——apply和call

讲道理说,这两个方法在开发中直接使用的并不多(当然也可能是我比较低端┑( ̄Д  ̄)┍),一般都用封装好的。


(47)apply和call

这个之前没研究过,今天简单的看了一下。

命令

简单介绍

例子

apply

将某个函数提供给另外一个对象使用,类似继承

提供的方法.apply(获取方法的对象, 参数);

call

改变函数中this指向的对象

方法.call(被this指向的目标, 传给方法的参数).

 

共同点:两个都是函数对象的方法。

 

call的说明:(略微修改自他人的博客,博客链接下附)

 

<!doctype html>
<html>
<head>
</head>
<body>
<input type="text" id="idTxt" value="input text">
<script type="text/javascript">
    var value = "global var";
    function mFunc() {
        this.value = "member var";
    }
    function gFunc() {
        alert(this.value);
    }
    window.gFunc();                                 // 全局的值
    gFunc.call(window);                             // 全局的值,this指向参数
    gFunc.call(new mFunc());                        // this指向mFunc
    gFunc.call(document.getElementById('idTxt'));   // this指向这个dom结点
</script>

<script language="javascript">
    var func = new function () {
        this.a = "func";
    }

    var func2 = function (x, y) {
        var a = "func3";
        alert(this.a);
        alert(x);
        alert(y);
    }

    func2.call(func, "func2", 'func3');     //this指向func这个函数,x是传递的参数
</script>
</body>
</html>


关于用call来进行继承(同样改自某博客的例子)

<!doctype html>
<html>
<head>
</head>
<body>
<script type="text/javascript">
    function baseA()        // base Class A
    {
        this.member = "baseA member";
        this.showSelfA = function()
        {
            window.alert(this.member);
        }
    }

    function baseB()        // base Class B
    {
        this.member = "baseB member";
        this.showSelfB = function()
        {
            window.alert(this.member);
        }
    }

    function extendAB()     // Inherit Class from A and B
    {
        baseA.call(this);   // call for A
        baseB.call(this);   // call for B
        // this指向的是extentAB这个方法,这里相当于将上面两个方法都执行了一遍,
        // 由于后调用的baseB,而两个都有member属性,因此后调用的baseB的member覆盖了baseA的member,
        // 但showSelfA和showSelfB没有冲突,因此两个方法都在
        // 这种写法相当于形成了一个继承的形式。
    }

    window.onload = function()
    {
        var extend = new extendAB();
        extend.showSelfA();     // show A
        extend.showSelfB();     // show B
    }
</script>
</body>
</html>

 

博客链接:

http://blog.csdn.net/sunboy_2050/article/details/6592082

 

 

apply可以参照这个(我之前写的):

apply是函数对象(function Function(){})的prototype方法中的一个方法

可以通过console.dir(Function)来打印全部方法

又因为所有函数都继承于Function函数,因此,所有函数都继承了这个方法。

apply的功能是,函数借用。将函数借用给一个对象,帮助他实现函数所定义的逻辑的功能。

如例子:

function ab(x, y) {
    this.x = x;
    this.y = y;
}
ab.prototype.move = function (x, y) {
    this.x += x;
    this.y += y
}
var c = new ab(1, 1);
console.log(c);
c.move(2, 2)
console.log(c);
p = {x: 0, y: 0, z: 0}
console.log(p);
c.move.apply(p, [5, 5])    //在这步,ab的实例c将move方法提供给了p,参数是数组
console.log(p);


输出结果为:

ab {x: 1, y: 1}

ab {x: 3, y: 3}

Object {x: 0, y: 0, z: 0}

Object {x: 5, y: 5, z: 0}

 

注:如果c中没有y,那么在
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值