defineProterty

Object.defineProperty JS中的一个方法,常用来定义属性的,在Vue.2x中的数据代理,是通过此方法来实现的!

  1. 参数
namedesc
targetObj目标对象
add property添加的属性
options配置项
  1. options 配置项
keyvalTypedefaultValdesc
valueany type‘18’ or 18 or ‘年龄’为目标对象定义的属性值
enumerableBooleanfalse控制属性是否可枚举,默认不能
writableBooleanfalse控制属性是否可修改,默认不可被修改
configurableBooleanfalse控制属性是否能被删除,默认不能
setterFunctioncallback(val)设置新的属性值
getterFunction-获取属性值
  1. 使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    let number = 19
    let targetObj = {
    name: '李四',
    sex: '男'
    }

    Object.defineProperty( targetObj, 'age', {
    value: '18', // 设置的属性值
    enumerable: true,
    writable: true,
    configurable: true,
    set: function(val) {
    // val 修改的新值
    console.log('当有人修改了 age 属性时, 该函数被触发调用') // 值被改变了
    number = val
    },
    get: function() {
    console.log('当有人读取了 age 属性时,该函数被触发调用') //
    return number
    }
    })

数据代理

  1. 定义

    通过一个对象代理,去视图(==修改== or ==访问==)另一个对象中的属性

  2. 案例

1
2
3
4
5
6
7
8
9
10
11
12
let obj1 = { x: 1 }
let obj2 = { y: 2 }

// obj2 视图 去访问或者修改 obj1 中的 x属性
Object.defineProperty(obj2, 'x', {
get() {
return obj1.x
},
set(val) {
obj1.x = val
}
})

Vue中的数据代理

vm 实例对象 可以视作为 以上案例的 ==obj2==,则 ==_data==可视作为 ==obj1==,当你视图去 ==访问== or ==修改== vm实例[obj2]对象的属性时,则相应的 _data[obj1]对象下的属性值也会被修改!

1
2
3
4
5
6
7
8
9
let vm = new Vue({
el: '#app',
data:{ // data 所对应的 _data对象,vue 会把这个对象中的属性,当做自身属性来使用
y: 1
}
})

console.log('vm', vm)
// vm 中有一个 _data 对象,这个对象所对应的 就是 vm 实例中的 data 对象

image

MVVM模型

  • ==MVVM== 视图模型,一种规范,其中 ==M==为[model]也就是模型数据,在vue中主要体现在==data==
  • ==VM== 则为[ViewModel] 视图模型的意思,作用于 modelview之间数据转换
  • ==V== 则为[view] 视图,主要体现在 <template>模板中,用来和用户做交互的

M - > data
VM - > vue实例
V -> html