参考:(javascript属性类型-数据属性和访问器属性)[http://www.cnblogs.com/zichi/p/5879291.html] 国庆节人不想出去看人山人海的景点,还是窝在家里敲代码比较惬意。
- vue数组更新检测 如果通过数组的一些方法来改变数据,vue能够检测到变动的数组,从而更新视图。但是如官方文档所说:
由于 JavaScript 的限制,Vue 不能检测以下变动的数组: 1.当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue 2.当你修改数组的长度时,例如:vm.items.length = newLength 解决:
Vue.set(items, indexOfitem, newValue)
//或者
items.splice(indexOfItem, 1, newValue)
- vue对象更改检测注意
还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。 但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。
- javascript的限制指的是什么?
- 数据属性 由于ECMAScript中有两种属性:数据属性和访问器属性。 数据属性的创建方式就是普通的字面量的方式,如:
var person = {
name: 'luoq'
}
数据属性有四个属性描述符分别是configurable、enumerable、writeable、value。对于直接在对象上定义的属性,它们的 [[Configurable]]、[[Enumerable]] 以及 [[Writable]] 特性都被设置为 true,而 [[Value]] 特性被设置为指定的值。 如果想要修改默认属性的特征,必须要使用ES5的Object.defineProperty()方法。如:
Object.defineProperty(person, 'name', {
enurmerable: false
})
- 访问器属性 访问器属性不包含数据值,也就是没有value特征,它是包含一对必须的getter setter函数。访问器不能直接定义, 必须使用Object.defineProperty来定义。
Object.defineProperty(book, '_year', {
get: function(){
return this._year
},
set: function(newValue){
if(newValue > 2004) {
this._year = newValue
this.edition += newValue - 2004
}
}
})
以上代码创建了一个book对象,并给它定义两个默认的属性:_year和edition,_year前面的下划线是一种常用的 记号,用于表示只能通过对象方法访问的属性。访问器属性通常会设置一个属性的值,导致其他属性发生变化。
- 回头来理解vue中的数据监测限制 我们都知道vue是数据双向绑定的,而原理就是利用了访问器属性来实现的。当创建一个Vue的实例的时候,其实内部 发生了类似如下的转换,将我们定义的数据属性,转换为了访问器属性:
function Vue(obj) {
obj.data.keys().forEach(prop, index) => {
Object.defineProperty(obj.data, prop, {
set(){
},
get(){
}
})
}
return obj
}
如果在Vue实例化之后,不使用对象方法操作数据,就不会触发访问器属性里的set方法,也就不会触发视图的更新。所以要注意使用对象方法或者使用Vue.set方法来直接触发set方法。