文章目录
  1. 1. 说明
    1. 1.1. 语法
    2. 1.2. 实例(call为主)
      1. 1.2.1. Note1.js
      2. 1.2.2. Note2.js
      3. 1.2.3. call VS apply
    3. 1.3. Reference

说明

Call() 和 Apply() 都能使目标对象指定一个所需要的this对象

语法

1
2
3
4
5
6
//---------call()---------
object.call(thisArg[, arg1[, arg2[, ...]]])
//thisArg : 指定的this对象
//arg1,arg2...为obejcet方法中所传入的参数值

//---------apply()--------

实例(call为主)

Note1.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Product(name, price){      //Product方法
this.name = name;
this.price = price;
if(price < 0)
throw RangeError('Cannot create product "' + name +'"');
}
function Food(name, price){ //Food类
Product.call(this, name, price); //看12th行
this.category = 'food';
}
Food.prototype = new Product(); //Food现在拥有了Product()的方法了
var cheese = new Food('feta', 5); //cheese现在是Food()的一个实例对象,在Food()函数中所指向的this就是cheese,而里面的call()函数中的name和price就被指定为'fete'和5了
console.log(cheese.category);//food
console.log(cheese.name + ' 价值: $' + cheese.price);//feta价值5

继承图:
Product -> Food -> ‘cheese’(实例)
name name feta
price price 5
category(new) food

Note2.js

1
2
3
4
5
6
7
8
9
10
11
12
var father = {
age : 50,
birthday : function(fPrefix, fPostfix){
return fPrefix + this.age++ +fPostfix; //this->father对象
}
};
var son ={
age : 22
};
console.log(father.birthday('Dad is ',' now.'));
console.log(father.birthday.call(son, 'Son is ',' now')); //this->son对象
console.log(father.birthday.apply(son,['Son is ',' now.']));

call VS apply

call接受args apply接受arg+args

apply 如果没有用数组, 会出现Uncaught TypeError: CreateListFromArrayLike called on non-object类似的问题

Reference

MDN-call()
rusticode.com
MSDN.aspx)
MDN-apply()

文章目录
  1. 1. 说明
    1. 1.1. 语法
    2. 1.2. 实例(call为主)
      1. 1.2.1. Note1.js
      2. 1.2.2. Note2.js
      3. 1.2.3. call VS apply
    3. 1.3. Reference