call/apply
1.功能:改变this指向
2.不同:传参列表不同
- call:
- Person(); == Person.call(); 执行起来是没有区别的。
- 使用Person.call(替代名),可以将原函数的所有this替换成obj
- 传参的规则: Person.call(obj,’cheng’,300)中,第一个为替换名,从第二开始为第一个实参。
使用示例:
<script type = "text/javascript">
function Person(name,age){
//this == obj
this.name = name; //这里就变成了obj.name = name;
this.age = age; //这里就变成了obj.age = age;
}
var person = new Person('deng',100);
var obj = {
}
// Person.call(obj,'cheng',300); //obj传入替换值
Person.call()Person();
//test() ---> test.call(); //这样写效果是一摸一样的
</script>
利用call简化代码:
例题:
<script type = "text/javascript">
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Person(name,age,sex,tel,grade){
this.name = name;
this.age = age;
this.sex = sex;
this.tel = tel;
this.garde = grade;
}
</script>
简化:
<script type = "text/javascript">
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Person(name,age,sex,tel,grade){
Person.call( this , name , age , sex)
this.tel = tel;
this.garde = grade;
}
var student = new Student('sunny' , 123 , 'male' , 139 , 2017);
</script>
- apply
call需要把实参按照形参的个数传进去—传几个形参就是几个 ( call,name,sex,tell )
apply需要按照数组的形式只传一个实参列表(argumens)—将几个形参变成一个数组传进去 (apply,[name sex , tell])