js中有三个改变this指针的方法,分别是 apply,call,bind。不少人只知道能改变的this,可是具体的适用场景不是太清楚。我也是遇到坑后不断的实践发现了区别。es6
call ,apply方法:数组
1 function Product(name, price) { 2 this.name = name; 3 this.price = price; 4 } 5 6 function Food(name, price) { 7 Product.call(this, name, price);
8 this.category = 'food'; 9 } 10 11 console.log(new Food('cheese', 5).name); 12 // expected output: "cheese"
在Food类中,由于使用了call改变类Product的类的this执向。因此这个时候在Product 中this定义的两个私有属性却成了Food类new出来对象的。这种方式实现了相似继承的概念,这种方式叫作call继承。app
其中call第一个参数表示的是修改的类的this指向值,后面两个name,price都是作为参数传递到Product中。最后在执行这条语句的时候,会执行一下Product这个类(函数)。也就是call就会执行一下 ‘’.‘’ 符号以前的类或者函数。函数
apply相对call来讲也是执行了一下函数或者类,只是参数传递进行了组装。若是要进行apply修改,第7句话就能够表达为 Prpduct.apply(this,[name,price]); 能够把要传递的参数进行数组化。this
bind:spa
bind是es6中新推出的修改this的方法。可是他和传统的call,apply区别就是函数或者类的this修改后没有执行,而是在程序代码检测时已经对代码的this指向进行了修改。那么有什么用呢?指针
好比我这个时候须要用DOM2级别的事件绑定 :code
document.addEventListener('click',fn); fn(){ this.name='yangkun' } //这里咱们给document元素对象添加了一个点击事件方法fn; var obj={name:'zhansan'}; fn.call(obj); 咱们须要的是修改fn中的this,指向是obj中的name.是若是这样作,会有一个问题就是,函数fn已经被执行了!实际上咱们绑定的click事件对应的是一个函数返回值(这里没有返回值,实际上点击事件绑定了null),而不是咱们但愿绑定的方法!
这个时候若是咱们使用fn.bind(obj)就没问题了。方法没有执行。对象
后记:JavaScript早期版本没有类,可是你们发现经过new能够实现相似后台语言的语法方式。天然把进行new 的函数说成类。 js 函数有三态,普通函数,类,对象。这个是ES6以前函数的三态。blog