<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply和call的应用</title>
</head>
<body>
</body>
<script type="text/javascript">
//apply的用法:Function.apply(obj,args)
/**
* 1、让一个对象继承另外一个对象的方法和属性,在这个例子中Student拥有了People所有的属性和方法,
但是有一点要注意就是Student的构造函数中需要继承People中的参数顺序必须和Peole的一致,比如
People(name,age)然后 Student(name,age,grade)Student中前二个参数输名字和顺序
必须和People一致,否则取不到或者是取得值不对
*/
/* function People(name,age){
this.name=name;
this.age=age;
this.run=function(){
alert("I can run");
}
}
function Student(name,age,grade){
People.apply(this,arguments);
this.grade=grade;
}
var s=new Student("zhangssan",18,"三年二班");
alert(s.name+","+s.age+","+s.grade);
s.run(); */
/**
* apply用法2:可以将数组转换成一个一个的参数,用在合适的地方,比如
有些函数不支持传入数组,用apply可以将数组转成一个个的参数再用
*/
/* var arr1=['1','2','3'];
var arr2=['4','5','6'];
Array.prototype.push.apply(arr1,arr2);
for(var i=0;i<arr1.length;i++){
alert(arr1[i]);
}
alert(Math.min.apply(null,arr2)); */
//call的用法call(object,par1,par2....)参数都是可选项
/**
* 1、和apply的用法是一样的,可以将上面的People.apply(this,arguments);改成People.call(this,name,age);
但是call更灵活,就是说可以改变参数的顺序
*/
function People(name,age){
this.name=name;
this.age=age;
this.run=function(){
alert("I can run");
}
}
function Student(age,name,grade){
People.call(this,name,age);
this.grade=grade;
}
var s=new Student(18,"zhangssan","三年二班");
alert(s.name+","+s.age+","+s.grade);
s.run();
//2、call的另一个巧妙的作用就是能改变函数运行时的指针
/**
var each=function(array,fn){
for(var index=0;index<array.length;index++){
fn(index,array[index]);
}
};
each([2,3,5],function(){
console.log(this);//这个时候this是window
});
**/
var each=function(array,fn){
for(var index=0;index<array.length;index++){
fn.call(array[index],index,array[index]);
}
};
each([2,3,5],function(){
console.log(this);//这个时候this是array[index]
});
</script>
</html>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply和call的应用</title>
</head>
<body>
</body>
<script type="text/javascript">
//apply的用法:Function.apply(obj,args)
/**
* 1、让一个对象继承另外一个对象的方法和属性,在这个例子中Student拥有了People所有的属性和方法,
但是有一点要注意就是Student的构造函数中需要继承People中的参数顺序必须和Peole的一致,比如
People(name,age)然后 Student(name,age,grade)Student中前二个参数输名字和顺序
必须和People一致,否则取不到或者是取得值不对
*/
/* function People(name,age){
this.name=name;
this.age=age;
this.run=function(){
alert("I can run");
}
}
function Student(name,age,grade){
People.apply(this,arguments);
this.grade=grade;
}
var s=new Student("zhangssan",18,"三年二班");
alert(s.name+","+s.age+","+s.grade);
s.run(); */
/**
* apply用法2:可以将数组转换成一个一个的参数,用在合适的地方,比如
有些函数不支持传入数组,用apply可以将数组转成一个个的参数再用
*/
/* var arr1=['1','2','3'];
var arr2=['4','5','6'];
Array.prototype.push.apply(arr1,arr2);
for(var i=0;i<arr1.length;i++){
alert(arr1[i]);
}
alert(Math.min.apply(null,arr2)); */
//call的用法call(object,par1,par2....)参数都是可选项
/**
* 1、和apply的用法是一样的,可以将上面的People.apply(this,arguments);改成People.call(this,name,age);
但是call更灵活,就是说可以改变参数的顺序
*/
function People(name,age){
this.name=name;
this.age=age;
this.run=function(){
alert("I can run");
}
}
function Student(age,name,grade){
People.call(this,name,age);
this.grade=grade;
}
var s=new Student(18,"zhangssan","三年二班");
alert(s.name+","+s.age+","+s.grade);
s.run();
//2、call的另一个巧妙的作用就是能改变函数运行时的指针
/**
var each=function(array,fn){
for(var index=0;index<array.length;index++){
fn(index,array[index]);
}
};
each([2,3,5],function(){
console.log(this);//这个时候this是window
});
**/
var each=function(array,fn){
for(var index=0;index<array.length;index++){
fn.call(array[index],index,array[index]);
}
};
each([2,3,5],function(){
console.log(this);//这个时候this是array[index]
});
</script>
</html>