对于原型链call/apply 的理解
JavaScript中有一个call和apply方法,两者的作用基本相同,
不过也有略微区别,用C语言的话来讲就是更改对象的内部指针,即是改变
this所指向的内容,通俗点说就是减少代码重复,提高代码的可读性和程
序的运行效率,就这么一个方法,但是几乎所有企业的面试题都不会少
了这俩哥儿,还有一个好哥们儿bind在这里就不说了,感兴趣的可以去
w3c了解一下,用法相似,总结成这么几点:
1. 都是改变函数的this对象指向
2. 第一个参数都是this指向的对象
3. 利用后续参数传参
- call方法和apply方法的第一个参数都是要传给当前对象的对象,就是this
**call使用格式**:对象名.call(this,数据1,数据2,数据3,......)
//数据的个数根据你所定义的function来定。
在这里简单的举个例子,("//"为注释)
例如:`function Person(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
}`
function Student(name,age,sex,tel,grade){
Person.call(this, name, age, sex);
//此处call调用了Person的方法,并把Person的方法
放在Student上执行,代替了这三行代码
//this.name = name;
//this.age = age;
//this.sex = sex;
this.tel = tel;
this.grade = grade;
}
var strdent = new Student("tom",16,"male",139,"2017");
*在此处由于使用了call方法,即在Student方法中省略了前三个对象的this
创建,但是效果和创建这三个对象一样,当然这只是简单的举例,接下来看看apply的用法,其实和call一样,区别在于:
-
call 需要把实参按照形参的个数传进去
-
apply 需要传一个arguments
apply的使用格式:对象名.apply(this,[arguments]) 同样的例子:`function Person(name, age, sex){ this.name = name; this.age = age; this.sex = sex; }` function Student(name,age,sex,tel,grade){ Person.apply(this, [name, age, sex]); //注意此处,apply只能传数组进去 this.tel = tel; this.grade = grade; } var strdent = new Student("tom",16,"male",139,"2017");
效果和call相同,只不过在不同的地方择优使用