Skip to content

delete

javascript
// 删除对象的 property, 如果对象是响应式的, 确保删除能触发视图更新。
// 如果是基本数据类型,警告。如果是数组并索引合法,直接调用 splice 删除,实现视图更新。
// 否则取出对象的 ob,如果 target._isVue 为真 或 ob.vmCount 为真说明要删除的对象是
// vm 或 data,直接警告。否则 Object.hasOwnProperty 判断对象自身中是否存在要删除的
// 属性,如果不存在,直接返回。否则通过 delete 删除该属性,最后如果 ob 为真就
// ob.dep.notify 通知视图更新。
Vue.delete = function del (target, key) {
  if (isUndef(target) || isPrimitive(target)) {
    // warn
  }
  
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.splice(key, 1); // 变更方法
    return
  }

  var ob = (target).__ob__;
  if (target._isVue || (ob && ob.vmCount)) {
    // warn
    return
  }
  
  // 删除一个不存在的属性
  if (!hasOwn(target, key)) {
    return
  }
  
  // 删除
  delete target[key];
  if (!ob) {
    return
  }
  
  // 通知视图更新
  ob.dep.notify();
}