参数
- obj1.call(obj2, param1, param2, ...)
- obj1.apply(obj2, [ param1, param2, ...] )
这两个函数的作用基本相同,主要是: obj2借用/代替obj1, 并且可以调用用obj1的方法; 不同之处是call的参数是排列的, 而apply的参数是一个数组; 需要注意的是被借用的函数/对象放在前面(obj1), 而借用函数/对象则是放在参数列表的第一个(obj2),可以总结为他人为上(哈, 就是你要借用别人的东西, 就要把别人放在第一位)
用法
函数
function dog(){
console.log("wang");
}
function cat() {
console.log("miao");
}
dog() // "wang"
cat() // "miao"
// call
dog.call(cat) // cat调用dog的方法 "wang"
// apply
cat.apply(dog) // dog调用cat的方法 "miao"
对象
function Dog() {}
Dog.prototype = {
say: function (a, b) {
console.log((a + b) + " , wang");
}
}
function Cat() {}
Cat.prototype = {
say: function (a, b) {
console.log((a + b) + " , miao");
}
}
var d1 = new Dog()
d1.say(1, 2) // "3, wang"
var c1 = new Cat()
c1.say(3, 4) // "7, miao"
// call
d1.say.call(c1, 5, 6) // c1借用d1的say方法 "11, wang"
c1.say.call(d1, 7, 8) // d1借用c1的say方法 "15, miao"
// apply
d1.say.apply(c1, [10, 11]) // c1借用d1的say方法 "21, wang"
c1.say.apply(d1, [12, 13]) // d1借用c1的say方法 "25, miao"
借用知乎上的记忆口诀:
猫吃鱼,狗吃肉,奥特曼打小怪兽。
有天狗想吃鱼了
猫.吃鱼.call(狗,鱼)
狗就吃到鱼了
猫成精了,想打怪兽
奥特曼.打小怪兽.call(猫,小怪兽)
网友评论