首页 > 代码库 > call与apply の 区别

call与apply の 区别

/**
 * 用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
 */
function add(a,b){
    alert(a+b);
}
function sub(a,b){


}
add.call(sub, 3, 1);//alert 4
/**
 * call 的意思是把 animal 的ShowName方法放到cat上执行;所以运行结果为:alert(‘Cat‘);
 */

function Animal(name){
    this.name = ‘Animal‘;
    this.ShowName = function(){
        alert(this.name);
    }
}
function Cat(name){
    this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();

animal.ShowName.call(cat);
/**
* Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.
* */
function Animal(name,name2){
    this.name = name;
    this.name2 = name2;
    this.ShowName = function(){
        alert(this.name);
        alert(this.name2);
    }
}
function Cat(name1,name){
    Animal.call(this,name1,name);
}
var cat = new Cat(‘我是老虎‘,‘我是病猫‘);

cat.ShowName();
/**
 * Class2同时继承Class10和Class11
 * */

function Class10()
{
    this.ShowSub = function(a,b){
        alert(a-b);
    }
}

function Class11()
{
    this.ShowAdd = function (a,b){
        alert(a+b);
    }
}

function Class2()
{
    Class10.call(this);
    Class11.call(this);
}
var cls2 = new Class2();
cls2.ShowSub(5,2);//alert(3)
cls2.ShowAdd(7,2);//alert(9)
 

接下来是apply的用法与理解

/**
 *apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.
 *call:和apply的意思一样,只不过是参数列表不一样.
 * .call(obj, arg1, arg2, arg3, ...);
 * .apply(obj,[arg1, arg2, arg3, ...])
 */
/


function Class10(name1,name2)
{
    this.name1 = name1;
    this.name2 = name2;
    this.ShowName = function(){
        alert(‘name1:‘ + this.name1);
        alert(‘name2:‘ + this.name2);
    }
}

function Class11(name1,name2,age)
{
    this.age = age;
    Class10.apply(this,arguments);//此处,Class11劫持了Class10的属性[name1,name2,age]与方法ShowName();
    this.ShowAge = function(){
        alert(‘age:‘ + this.age);
    }
}

var cls = new Class11(‘名字1‘,‘名字2‘,‘好几岁了‘);
cls.ShowName();
cls.ShowAge();

代码大多是网上找的资料,然后自己随手做了一下小改动,测试通过,便于自己理解-w-

便于理解的格式:

父类.call(子类);

父类.apply(子类,arguments);

 

和C#相反:

class 子类 : 父类 { ... }

 

call与apply の 区别