首页 > 其他分享 >vue2为什么只重写了7个数组方法

vue2为什么只重写了7个数组方法

时间:2023-11-17 16:02:54浏览次数:36  
标签:vue2 重写 数组 Array prototype 方法 method

首先看源码

//即将要被劫持的数组
let arr = [1, 2, 3];

//先把要劫持的方法列出来
let methods = ["push", "pop", "shift", "unshift", "reverse", "sort", "splice"];

//既然要劫持原型,就要先把原型拿过来
let arrayProto = Array.prototype;
//创建一个自己的原型方法
let arrayMethods = Object.create(Array.prototype);

//遍历方法
methods.forEach((method) => {
  //给每个方法做切片
  arrayMethods[method] = function (...args) {
    //还是先调用真正的原型方法获得正常的返回值
    const result = arrayProto[method].apply(this, args);
    //模拟插入切片
    console.log(`调用了${method}方法`);

    return result;
  };
});
arr.__proto__ = arrayMethods;
// 数组重写
const originalProto = Array.prototype;
const arrayProto = Object.create(originalProto)[
  ("push", "pop", "shift", "unshift", "splice", "reverse", "sort")
].forEach((method) => {
  arrayProto[method] = function () {
    originalProto[method].apply(this.arguments);
    dep.notice();
  };
});

// set、delete
Vue.set(obj, "bar", "newbar");
Vue.delete(obj, "bar");

确实只有 7 个方法被重写,至于为什么是 7 个,观察了一下特征,这 7 个方法都是能改变数组本身的方法,也只有这个数组本身改变需要检测才需要去重新通知。接着去 MDN 查了下,能改变数组本身分方法的还有以下这两个方法

Array.prototype.fill();
Array.prototype.copyWithin();

那为什么 vue 没有重写这两个方法呢,后来想了下,vue2 出生的早,这两个方法 es6 出生的晚,那时候还不兼容这两个方法,现在 vue2 给一个数组用 fill 方法,不就监听不到变化?于是用代码试了下

data() {
  return {
    arr: [1, 2, 4]
  }
}
test() {
  this.arr.fill(0, 0, 2);
},
<el-button @click="test"></el-button>
<div v-for="(item, i) in arr" :key="i">{{ item }}</div>

点了没反应,数组不会重新渲染。

结论:vue2 是旧时代的产物了,能上 3 就上 3 吧,3 里面这种问题就不复存在。

标签:vue2,重写,数组,Array,prototype,方法,method
From: https://www.cnblogs.com/wp-leonard/p/17838947.html

相关文章

  • vue2.0源码简读(5. 扩展)
    5.1event平时开发工作中,处理组件间的通讯,原生的交互,都离不开事件。对于一个组件元素,不仅仅可以绑定原生的DOM事件,还可以绑定自定义事件,非常灵活和方便。那么接下来从源码角度来看看它的实现原理。为了更加直观,通过一个例子来分析它的实现:letChild={template:'<button......
  • vue2.0源码简读(6. Vue Router)
    6.1路由注册Vue从它的设计上就是一个渐进式JavaScript框架,它本身的核心是解决视图渲染的问题,其它的能力就通过插件的方式来解决。Vue-Router就是官方维护的路由插件,在介绍它的注册实现之前,先来分析一下Vue通用的插件注册原理。Vue.useVue提供了Vue.use的全局API来......
  • vue2.0源码简读(7. Vuex)
    7.1Vuex初始化这一节主要来分析Vuex的初始化过程,它包括安装、Store实例化过程2个方面。安装当在代码中通过importVuexfrom'vuex'的时候,实际上引用的是一个对象,它的定义在src/index.js中:exportdefault{Store,install,version:"__VERSION__",mapSt......
  • Java生成随机三维数组图片推流
    生成随机的三维数组frame=np.random.randint(1,254,size=(720,1280,3)).astype(np.uint8)三维数组图片添加时间frame=cv2.putText(frame,datetime.datetime.now().__str__(),(100,100),cv2.FONT_HERSHEY_SIMPLEX,2.0,(255,255......
  • 数组
    一、二分二分法使用条件:1、要有序。2、无重复的数。二分法算细节:二分有不变量和变量。变量的改变要始终遵循不变量的规则。区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。三......
  • jq 数组对象,重复数据进行合并
    var bindif = [{        "ifname": "Ge0/2/1",        "ip": "20.1.1.1",        "mask": "255.255.255.0"    }, {        "ifname": "Ge0/2/5",        "ip6addr": &q......
  • 数组下标运算符[]
    数组表示一块连续的特定类型对象组成的空间结构,指针通俗指代某个对象的地址(其实包含了地址和地址上对象大小两层意思),数组和指针不能等同。也许唯一的联系是,数组的运算采用指针的方式实现。所以当我们定义一个数组array时,数组array在大多数表达式中会转换成首元素的指针。而很多......
  • 汇编-SIZEOF返回数组字节总数
     SIZEOF操作符的返回值等于LENGTHOF与TYPE的返回值的乘积.386.modelflat,stdcall.stack4096ExitProcessPROTO,dwExitCode:DWORD.dataintArrayWORD32DUP(0).codemainPROCmoveax,SIZEOFintArray;EAX = 00000040h=64INV......
  • 十、数组
    十、数组1、数组的概念1)引出数组需求:学校为了统计学生的信息,需要设计一个程序,要求如下,一共有十个学员,要求依次输入各位学员的学号,并将其打印出来。#include<iostream>intmain(){intstudentId1,studentId2,studentId3,studentId4,studentId5;std::cin>>s......
  • Java数组05:数组的使用
    publicclassArrayDemo03{publicstaticvoidmain(String[]args){int[]arrays={1,2,3,4,5};//打印全部的数组元素for(inti=0;i<arrays.length;i++){System.out.println(arrays[i]);}System.out.pr......