在ES中,函数也是是对象的一种,每个函数都包含两个属性:length和prototype,且每个函数包含两个非继承而来的方法apply()和call()。这两个方法都是在作用域中调用函数,相当于设置函数内this对象值。

1.obj.apply(db,arr) db是作用域,arr是一组参数

db: 第一个参数是 this 的指向对象;

arr:第二个参数可以是Array的实例,也可以是arguments对象——不能直接使用字符串当参数,需要放到数组里面

var name = "张二" ;age= "16";

var obj = {
name:"李三",
o_age: this.age,
mf:function(who){
console.log(this.age+"岁的"+this.name+"吃"+who+"的饭");
}
}
var db = {
name:"王五",
age:"36"
}

obj.mf.apply(db,["姑姑"]); //35岁的王五吃姑姑家的饭

2.obj.call(db,"str1","str2"...) db是作用域,第二个之后的数据是字符串参数,传递的参数必须列举出来!

var obj = {
name:"李三",
o_age: this.age,
mf:function(f,t){
console.log(this.name+"年龄:"+this.age+",来自"+f+"要去"+t);
}
}
var db = {
name:"王五",
age:"36"
}
obj.mf.call(db,'郑州',"上海");//王五年龄:36,来自郑州要去上海

公式的中obj提供方法,db提供数据,相对来说,db数据劫持了obj的方法,而obj继承了db的属性数据

另外,call和apply等,继承不了父类原型对象上的属性,只能继承构造函数内的属性


js/javascript函数中的apply()和call()_js