深入浅出Vue中为什么不能检测数组变化

Object.defineProperty了解一下

    可以理解为给属性定义属性的方法

    具体例子


深入浅出Vue中为什么不能检测数组变化_第1张图片

这里我们给book添加了name,和page二个属性,通过属性给其设置值和取值的时候会调用我们定义的set,get方法。

Vue中就是靠这个方法给每一个对象嵌套般的加了get,set方法,并且要达到响应式,要求是对象上已定已的属性,后期添加的不算,但是可以通过Vue.set这个全局方法给其添加,因为当初定义的都可以使用这个方法添加上,但是你后添加的属性并没有执行这个方法,所以无法实现响应式,基于此,我们可以类比数组, 比如一个数组 var arr = [1,2,3] 这时候可以认为arr的数组索引是他们的属性,arr[index]是能取到值的,想当于属性去访问值,因此我们可以认为0,1,2是arr的属性,如果是在vue中,可以认为Vue给0,1,2添加了get,set方法,但是比如我们给arr[3]=3,这时候3这个(属性)下标被赋值了一个3,想当于添加了一个属性,但是不要忘了,这是后添加的,因此vue给数组都实现了怪异方法实现响应式(具体可见官网介绍)。

js每日tips

    1.非Object的原型对象.__proto__指向Object.prototype 而Object.prototype.__proto__=null

    2.所有的构造函数 Function Object Date Array Regxp 等等其他内置函数的__proto__ 都是Function.prototype

    3.一般来说被new出来的对象三步到头==》null

        eg: function Person(){ this.name =name}

            var p1 = new Person()

            p1.__proto__=Person.prototype

            p1.__proto__.__proto__=Object.prototype

            p1.__proto__.__proto__.__proto__=null

    而构造函数 Person

    Person.__proto__=Function.prototype

   Person.__proto__.__proto__=Obejct.prototype

Person.__proto__.__proto__.__proto__=null

你可能感兴趣的:(深入浅出Vue中为什么不能检测数组变化)