JS常用方法(一)

JS——call和apply用法

JS中每个函数都包含两个非继承而来的call()和apply()方法,它们的作用是一样的

方法说明: 调用一个对象的一个方法,用另一个对象替换当前对象;将一个函数的对象上下文从初始的上下文改变为thisObj指定的对象;

1. call(thisObj,arg1,arg2…)

参数: thisObj表示 将被用作当前对象 的对象; arg1,arg2表示 传递给当前对象的参数

注意: 两个参数均可省略,但thisObj省略,那么Global对象将被用作thisObj;参数必须一一列举出来

例1

1
2
3
4
5
6
7
8
9
10
11
12
function func1(){
this.name = 'Tom';
this.words = function(words){
console.log('I am ',words);
}
}
function func2(){
func1.call(this);
}
var func3 = new func2();
func3.words('George'); // I am George
console.log(func3.name); // Tom

以上代码,func2中func1调用了call方法,等于是在func2中执行了func1();此时func2继承了func1的属性和方法。

例2

1
2
3
4
5
6
7
8
9
10
11
12
var Pet = {
words: "......",
speak:function(say){
console.log(say + " " + this.words);
}
}
Pet.speak('Speak'); // Speak ......
var Dog = {
words:"Wang"
}
//调用call时,this指向了Dog
Pet.speak.call(Dog,"Speak") // Speak Wang

2. apply(thisObj,[argArray])

参数: thisObj表示 将被用作当前对象 的对象; argArray表示 传递给当前对象的参数

注意: 两个参数均可省略,但thisObj省略,那么Global对象将被用作thisObj;参数必须是数组形式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Person(name,age){
this.name=name;
this.age=age;
}
/*定义一个学生类*/
function Student(name,age,grade){
Person.apply(this,arguments);
this.grade=grade;
}
//创建一个学生类
var student=new Student("zhangsan",21,"一年级");
//测试
console.log("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
//测试结果name:zhangsan age:21 grade:一年级
//Student方法里面没有给name和age属性赋值,apply使其继承了Person的属性和方法
-------------本文结束感谢您的阅读-------------