. 每一个函数都包含两个非继承而来的函数: call,apply. 在特定的作用域中调用函数, 实际上相当于 函数体内this对象的值
.call,apply 用途之一就是传递参数. 实际上强大的地方是 : 扩大函数的作用域
eg1: ( 传递参数 )
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function sum(x,y){
return x+y;
}
function call1(n1,n2){
return sum . call ( this,n1,n2 ); //~~~ return sum.apply(this , [ n1, n2 ] );
}
alert(call1(10,20)); //alert(30);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
eg2: (扩充作用域) 好处: 对象和方法 没有 耦合关系
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
window.color = ‘ red ‘;
var obj = { color : ‘ blue‘};
function showColor() {
alert( this.color );
}
showColor.call( window ); // showColor.call(this); // red
showColor.call( obj ); //blue
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//自定义对象
function Obj ( x , y){
this.x = x;
this.y = y;
return x*y ;
}
// 方法
function fun( a , b ){
return a + b;
}
var obj = new Obj (10 , 20);
alert( fun . call ( obj , obj.x , obj.y ); // 30
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
举几个具体例子:
例子1:
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
//add.call(sub,3,1);
add.apply(sub,[3,1]);
例子2:
function Class1()
{
this.name = "class1";
this.showNam = function()
{
alert(this.name);
}
}
function Class2()
{
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
//c1.showNam.call(c2); //class2
c1.showNam.apply(c2);
例子3:
var func=new function(){this.a="func"};
// var func = { a:"func"};
var myfunc=function(x){
var a="myfunc";
alert(this.a);
alert(x);
};
// myfunc.apply(func,"var");
myfunc.apply(func,["var"]);
例子4:[吊炸天有木有~call 可以用来实现继承]
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}
function Class2()
{
Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc");
例子5:多继承[javaScript 如何来模拟面向对象的继承,还可以实现多重继承]
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 c2 = new Class2();
c2.showAdd(1,4); //5
c2.showSub(10,6);//4
Call && apply 用法