code: function(component, expr1, expr2){
      var type = _.typeOf(expr1);
      if( expr1.type === 'expression' || type === 'string' ){
        this._bind(component, expr1, expr2)
      }else if( type === "array" ){ // multiply same path binding through array
        for(var i = 0, len = expr1.length; i < len; i++){
          this._bind(component, expr1[i]);
        }
      }else if(type === "object"){
        for(var i in expr1) if(expr1.hasOwnProperty(i)){
          this._bind(component, i, expr1[i]);
        }
      }
      // digest
      component.$update();
      return this;
    }
docs: create two-way binding with another component;
  *warn*:
  expr1 and expr2 must can operate set&get, for example: the 'a.b' or 'a[b + 1]' is set-able, but 'a.b + 1' is not,
  beacuse Regular dont know how to inverse set through the expression;
  
  if before $bind, two component's state is not sync, the component(passed param) will sync with the called component;
  
  *example: *
  
  ```javascript
  // in this example, we need to link two pager component
  var pager = new Pager({}) // pager compoennt
  var pager2 = new Pager({}) // another pager component
  pager.$bind(pager2, 'current'); // two way bind throw two component
  pager.$bind(pager2, 'total');   //
  // or just
  pager.$bind(pager2, {"current": "current", "total": "total"})
  ```
  
  @param  {Regular} component the
  @param  {String|Expression} expr1     required, self expr1 to operate binding
  @param  {String|Expression} expr2     optional, other component's expr to bind with, if not passed, the expr2 will use the expr1;
  @return          this;