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 子类 : 父类 { ... }

时间: 2024-10-28 22:19:41

call与apply の 区别的相关文章

JS中call和apply区别有哪些 记录

一.call和apply区别 传递参数的方式.用法上不同,主要是参数不完全同 (1).B.Function.call(A,arg,arg) 这个例子是讲A对象“调用”B对象的Function(某个具体的方法). 注意call方法中的参数arg: a) arg的个数为零或多个; b) arg可以是任何类型,包括Array. call在这里译为“调用”,在JS中可以理解为“A对象调用B对象的某个方法”: (2).B.Function.apply(A,args) 这个例子是讲A对象“应用”B对象的Fu

call和apply区别

call和apply 基本上是一个意思 区别在于call的第二个参数可以是任意的类型,而apply的第二个参数必须是数组,也可以是arguments.call方法:语法:call(thisObj,Object)定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj.

CROSS APPLY和 OUTER APPLY 区别详解

SQL Server 2005 新增 cross apply 和 outer apply 联接语句,增加这两个东东有啥作用呢? 我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的.实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数)的, 更重要的是这个函数的参数是另一个表中的字段.这个解释可能有些含混不请,请看下面的例子: -- 1. cross join 联接两个表 select * from T

CROSS APPLY 和 OUTER APPLY 区别

我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的.实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数)的, 更重要的是这个函数的参数是另一个表中的字段. -- OUTER APPLYselect *  from TABLE_1 T1cross apply FN_TableValue(T1.column_a) -- OUTER APPLYselect *  from TABLE_1 T1outer 

call()与apply()区别

一.方法的定义 call方法: 语法:call(thisObj,Object)定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply(thisObj,[argArray])定义:应用某一对象的一个方法,用另一个对象替换当前对象.

JavaScript函数 bind call apply区别

1. apply calll 在JavaScript中 call 和 apply 都是为了改变某个函数运行时上下文而存在的, 换句话说就是为了改变函数内部的this的指向. 这里我们有一个新的对象 banana对象 但是没有say方法 我们可以通过call 或者apply用apple的say方法. 直接传入banana进去 使得this指向banana对象. apply和 call 本质上完全一样 只是 接收的参数不一样 call把参数(参数个数是确定的)逐个放进去.而apply的参数(参数是不

012_call和apply区别

一. function fn(a,b) { console.log(this); } fn.call(null,1,2); //call为参数方式 fn.apply(null,[1,2]); //apply为数组方式 /*输出=> Object [global] { DTRACE_NET_SERVER_CONNECTION: [Function], DTRACE_NET_STREAM_END: [Function], DTRACE_HTTP_SERVER_REQUEST: [Function],

apply,call,bind的区别

apply和call 在js中,apply,call,bind都是为了改变函数的执行上下文的而存在的,即改变函数内部this的指向. 下面的例子可以说明我们为什么要用apply和call,以及apply和call的区别. function Person(){}; Person.prototype = { name:'John', sayName:function(type){ console.log(this.name + " "+ type); } } var testPerson

apply,call,bind区别

js中有三个改变this指针的方法,分别是 apply,call,bind.很多人只知道能改变的this,但是具体的适用场景不是太清楚.我也是遇到坑后不断的实践发现了区别. call ,apply方法: 1 function Product(name, price) { 2 this.name = name; 3 this.price = price; 4 } 5 6 function Food(name, price) { 7 Product.call(this, name, price);