code: function $unhook(targ, attr) {
      if (!(Array.isArray(targ) && targ.W)) return;
      var tp = typeof attr === 'undefined' ? 'undefined' : _typeof(attr);
  
      if (tp == 'string' || tp == 'number') {
        if (this[attr] === targ) delete this[attr];
      } else {
        // take attr as undefined
        var b = Object.keys(this);
        for (var i = 0, sKey; sKey = b[i]; i += 1) {
          if (targ === this[sKey]) {
            delete this[sKey]; // sKey maybe 'attr' or '0','1' ...
            break; // only remove one extractly target
          }
        }
      }
      delete targ.parent;
      delete targ.$callspace;
    }
docs: /* // disable using: W.push/splice/unshift/shift/pop
  push: function() {
  var iRet = this.length;
  for (var i=0,item; item=arguments[i]; i++) {
  if (Array.isArray(item) && item.W) {
  iRet = Array.prototype.push.call(this,item);
  item.parent = this;
  }
  }
  return iRet;
  },
  push: function() {
  throw new Error('not support push()');
  },
  splice: function() {
  throw new Error('not support splice()');
  },
  unshift: function() {
  throw new Error('not support unshift()');
  },
  shift: function() {
  throw new Error('not support shift()');
  },
  pop: function() {
  throw new Error('not support pop()');
  },