You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The text was updated successfully, but these errors were encountered: