美文网首页
apply、call与bind

apply、call与bind

作者: 陈大事_code | 来源:发表于2019-04-28 14:32 被阅读0次

三个api的核心概念:借用方法。

场景解释

现实:我中午需要做饭,但是我没有锅,但是邻居家有锅,此时我有两种方法,一:我自己去买锅做饭,二:跟邻居家借一下锅做饭。显然第二种方法更加好。
js中:A对象需要一个方法,但是B对象有这个方法,此时我有两种方法,一: 我自己对象中写个一样的方法,二:跟B对象借一下这个方法,同理,显然第二种方法更加好,且节省内存高效。

apply用法

定义:能劫持另外一个对象的方法,继承另外一个对象的属性.

看起来可能有点懵逼,举个栗子:

/*定义一个人对象*/
function Person(name,age) { 
    this.name=name; 
    this.age=age; 
} 
 /*定义一个学生对象*/ 
function Student(name,age,grade) { 
    Person.apply(this,arguments); 
    this.grade=grade; 
}

其中,apply中的this指的Student对象(原因自己去查下this的用法)。apply作用就是使得this(即:student)能够使用Person中的构造方法,省略了this.name=name; this.age=age;

区别

  • apply、call的区别就是接收参数不同(仅此而已),如:
apply(this.arguments)
call(this.param1,param2,param3)
  • bind与他们的区别就是,bind劫持方法之后不会立刻执行,且返回一个该方法的拷贝。但是apply/call劫持之后会立刻执行,且返回方法的执行结果。

有效用法

利用apply的特性,apply的参数列表中arguments是一个数组,apply默认将这个数组转为一个参数列表。

([param1,param2,param3]) 转换为 (param1,param2,param3)

由上,我们可以做到:

筛选数组中的最大值(es5的做法)
Math.max.apply(null,[2,3,4,1])  // 4

因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组,只能接收一个参数列表,即:Math.max(param1,param2)

但是,小编发现一个更简单的方法:Math.max(...[2,3,4,1])

对于筛选最小值(es5的做法),同理,即:
Math.min.apply(null,[2,3,4,1])  // 1

对于上面这两种求最大最小值的方法,es6有更为方便的解决策略--扩展运算符

Math.max(...[2,3,4,1]) // 4

个人推荐大家还是尽量使用es6的扩展运算符的方法

相关文章

网友评论

      本文标题:apply、call与bind

      本文链接:https://www.haomeiwen.com/subject/dzmdnqtx.html