code: function attr(name, value) {
      var self = this;
      if (arguments.length === 0) {
        return self._attrs;
      }
      if (Util.isObject(name)) {
        // self._attrs = Util.deepMix(self._attrs, name);
        for (var k in name) {
          this._setAttr(k, name[k]);
        }
        self.clearBBox();
        this._cfg.hasUpdate = true;
        return self;
      }
      if (arguments.length === 2) {
        this._setAttr(name, value);
        self.clearBBox();
        this._cfg.hasUpdate = true;
        return self;
      }
      return self._attrs[name];
    }
docs: 设置或者设置属性，有以下 4 种情形：
  - name 不存在, 则返回属性集合
  - name 为字符串，value 为空，获取属性值
  - name 为字符串，value 不为空，设置属性值，返回 this
  - name 为键值对，value 为空，设置属性值
  
  @param  {String | Object} name  属性名
  @param  {*} value 属性值
  @return {*} 属性值