docs: function linkList(opt) {
      var mainData = opt.mainData;
      var datas = opt.datas;
  
      if (!datas) {
          datas = {main: mainData};
          opt.datasAttr = {main: 'data'};
      }
      opt.datas = opt.mainData = null;
  
      linkAll(mainData, datas, opt);
  
      // Porxy data original methods.
      each(datas, function (data) {
          each(mainData.TRANSFERABLE_METHODS, function (methodName) {
              data.wrapMethod(methodName, zrUtil.curry(transferInjection, opt));
          });
  
      });
  
      // Beyond transfer, additional features should be added to `cloneShallow`.
      mainData.wrapMethod('cloneShallow', zrUtil.curry(cloneShallowInjection, opt));
  
      // Only mainData trigger change, because struct.update may trigger
      // another changable methods, which may bring about dead lock.
      each(mainData.CHANGABLE_METHODS, function (methodName) {
          mainData.wrapMethod(methodName, zrUtil.curry(changeInjection, opt));
      });
  
      // Make sure datas contains mainData.
      zrUtil.assert(datas[mainData.dataType] === mainData);
  }