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"