关于javascript中call()和apply()方法的使用,网上有一博友已经写得非常清楚,链接地址如下:
关于JavaScript中apply与call的用法意义及区别
在了解了javascript中call和apply方法的使用方法之后,下面具体讲一下继承的实现方式:
<html>
<head>
<title></title>
</head>
<body>
<script language="javascript" type="text/javascript">
function ClassParent(name){
this.name = name;
this.sayName = function(){
alert(this.name);
}
}
//一‘对象冒充
function ClassChild(name,sex){
this.newMethod = ClassParent;//函数名指针指向ClassParent;
this.newMethod(name);//调用该方法。
delete this.newMethod;//删除对ClassParent的引用,这样以后就不能再调用它了。
this.sex = sex;
this.saySex= function(){
alert(this.sex);
}
}
var obj = new ClassChild("jesen","nan");
obj.saySex();
obj.sayName();
//二、call()方法
function ClassChild2(name,sex){
ClassParent.call(this,name);
this.sex=sex;
this.saySex = function(){
alert(this.sex);
}
}
var obj2 = new ClassChild2("jesen2","nan2");
obj2.saySex();
obj2.sayName();
//三、apply()方法
function ClassChild3(name,sex){
ClassParent.apply(this,new Array(name));
//ClassParent.apply(this,arguments);此处可以使用参数对象arguments,当然只有是在超类中的参数顺序与子类中的参数顺序完全一致时才适用。
this.sex=sex;
this.saySex = function(){
alert(this.sex);
}
}
var obj3 = new ClassChild2("jesen3","nan3");
obj3.saySex();
obj3.sayName();
//四、原型链
function ClassPrototypeParent(){
}
ClassPrototypeParent.prototype.name="jesen4";
ClassPrototypeParent.prototype.sayName=function (){
alert(this.name);
}
function ClassPrototypeChild(){
}
ClassPrototypeChild.prototype = new ClassPrototypeParent();//原型链必须确保构造函数没有任何参数。
ClassPrototypeChild.prototype.name="jesen4child";
ClassPrototypeChild.prototype.sex="nan4child";
ClassPrototypeChild.prototype.saySex=function(){
alert(this.sex);
}
var objp = new ClassPrototypeParent();
var objc = new ClassPrototypeChild();
objp.sayName();
objc.sayName();
objc.saySex();
//五、混合方式
//javascript创建类得最好的方法是用构造函数定义属性,用原型方式定义方法。
</script>
</body>
</html>
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别。
先来看看JS手册中对call的解释:
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。
引用网上一个代码段,运行后自然就明白其道理。
< script >
function Obj(){ this .value = " 对象! " ;}
var value = " global 变量 " ;
function Fun1(){alert( this .value);}
window.Fun1(); // global 变量
Fun1.call(window); // global 变量
Fun1.call(document.getElementById('myText')); // input text
Fun1.call( new Obj()); // 对象!
</ script >
call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。
运行如下代码:
var func = new function (){ this .a = " func " }
var myfunc = function (x){
var a = " myfunc " ;
alert( this .a);
alert(x);
}
myfunc.call(func, " var " );
</ script >
可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])
同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入.