code: function (path, loop) {
          var target;
          var animatingShape = false;
          var el = this;
          var zr = this.__zr;
          if (path) {
              var pathSplitted = path.split('.');
              var prop = el;
              // If animating shape
              animatingShape = pathSplitted[0] === 'shape';
              for (var i = 0, l = pathSplitted.length; i < l; i++) {
                  if (!prop) {
                      continue;
                  }
                  prop = prop[pathSplitted[i]];
              }
              if (prop) {
                  target = prop;
              }
          }
          else {
              target = el;
          }
  
          if (!target) {
              log(
                  'Property "'
                  + path
                  + '" is not existed in element '
                  + el.id
              );
              return;
          }
  
          var animators = el.animators;
  
          var animator = new Animator(target, loop);
  
          animator.during(function (target) {
              el.dirty(animatingShape);
          })
          .done(function () {
              // FIXME Animator will not be removed if use `Animator#stop` to stop animation
              animators.splice(indexOf(animators, animator), 1);
          });
  
          animators.push(animator);
  
          // If animate after added to the zrender
          if (zr) {
              zr.animation.addAnimator(animator);
          }
  
          return animator;
      }
docs: 动画
  
  @param {string} path The path to fetch value from object, like 'a.b.c'.
  @param {boolean} [loop] Whether to loop animation.
  @return {module:zrender/animation/Animator}
  @example:
  el.animate('style', false)
  .when(1000, {x: 10} )
  .done(function(){ // Animation done })
  .start()