bindAll
4.2 bindAll方法
4.2.1 语法:
_.bindAll(object, *methodNames)
4.2.2 说明:
object:第一个参数为要操作的对象。
*methodNames: 要绑到对象上的多个方法(必传)。
把methodNames参数指定的一些方法绑定到object上,这些方法就会在对象的上下文环境中执行。绑定函数用作事件处理函数时非常便利,否则函数被调用时this一点用也没有。methodNames参数是必须的。
示例一: bindAll未使用前和使用后的区别。
//简单的例子:
console.log(1);
//=>1
var log = console.log;//赋值的方法不能改变this指针的指向;
log(1);
//Uncaught TypeError: Illegal invocation
//bindAll未使用
var object = {
name: 'zhang san',
getName: function () {
return this.name;
}
};
console.log(object.getName());
//=>"zhang san"
var getName = object.getName;
console.log(getName());
//=>undefined
//bindAll使用
var object = {
name: 'zhang san',
getName: function () {
return this.name;
}
};
_.bindAll(object, 'getName');
console.log(object.getName());
//=>zhang san
var getName = object.getName;
console.log(getName());
//=>zhang san
//也可以用bind来实现效果和bindAll一样
var object = {
name: 'zhang san',
getName: function () {
return this.name;
}
};
console.log(object.getName());
//=>zhang san
var getName = object.getName.bind(object);
console.log(getName());
//=>zhang san
//第一个例子的解决方法
console.log(1);
//=>1
_.bindAll(console,"log");
var log = console.log;
log(1);
//=>1
示例二: 对象一旦使用bindAll即使被赋值到其他对象上,指针仍会指向被绑定的对像
var curly = {
name: 'curly'
},
moe = {
name: 'moe',
getName: function () {
return 'name: ' + this.name;
},
sayHi: function () {
return 'hi: ' + this.name;
}
};
curly.getName = moe.getName;
_.bindAll(moe, 'getName', 'sayHi');
curly.sayHi = moe.sayHi;
curly.getName(); //释放函数绑定到当前的对象
//=> name: curly
curly.sayHi(); //绑定函数仍然是绑定到原始对象的
//=> hi: moe
示例三:对象bindAll后,再执行对象里的方法传参数,如果输出内容指针指向this,那这个this仍指向绑定对象的内容。
var moe = {
name: 'moe',
getName: function () {
return 'name: ' + this.name;
},
sayHi: function () {
return 'hi: ' + this.name;
},
sayLast: function () {
return this.sayHi(_.last(arguments));
}
};
_.bindAll(moe, 'sayHi', 'sayLast');
var sayLast = moe.sayLast;
sayLast(1, 2, 3, 4, 5, 6, 7, 'Tom');
//=>"hi: moe"