function Fruit() {}
Fruit.prototype = {
color: 'red',
say: function() {
console.log('My color is ' + this.color);
}
}
var apple = new Fruit(); // 创建实例对象
apple.say(); // My color is red
// 使用call、apply更换对象
var banana = {color: 'yellow'}
apple.say.call(banana); // My color is yellow
var o = new Foo();
// 首先 => var o = new Object(); JS会开辟一块内存,创建一个实例对象;
// 然后 => o.__proto__ = Foo.prototype; 将实例对象的__proto__指向构造函数的Prototype,继承所有属性和方法;
// 然后 => Foo.call(o); 将构造函数中的this指向实例对象
call、apply用法
call和apply都是为了改变某个函数运行时的 上下文(context) 而存在的,也就是改变函数体内部this的指向。
JS函数存在 「定义时上下文」 、 「运行时上下文」 及 「上下文是可以改变的」 这样的概念。
当一个Object没有某个方法(例子中的banana没有say方法),但其他的对象有(例子中apple有say方法),我们可以借助call或apply用其他对象的方法来操作。
call、apply区别
call:需要把参数按顺序传递进去 apply:需要把参数放在数组里面
call、apply应用
数组之间追加
获取数组中的最大值、最小值
验证是否是数组
类数组使用数组方法
实现一个log方法代理console.log
当传入的参数不确定时,上面的代码就失效了。
接下来需要给输出的内容添加一个前缀字符串
bind应用
在常见的单体模式中,通常我们会使用_this/that/self等保存this,这样我们在改变了上下文之后继续引用到原this。
使用bind()优雅的解决上下文问题
call、apply、bind比较
当你希望改变上下文环境之后,并非立即执行,而是回调函数时,使用bind()方法;而call/apply则会立即执行函数。
参考: MDN Function.prototype.bind() 深入浅出 妙用Javascript中apply、call、bind