proxy
Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
app._data.name
// vue 设计, 不希望访问 _ 开头的数据
// vue 中有一个潜规则:
// - _ 开头的数据是私有数据
// - $ 开头的是只读数据
app.name
// 将 对 _data.xxx 的访问 交给了 实例
// 重点: 访问 app 的 xxx 就是在访问 app._data.xxx
假设:
var o1 = { name: '张三' };
// 要有一个对象 o2, 在访问 o2.name 的时候想要访问的是 o1.name
Object.defineProperty( o2, 'name', {
get() {
return o1.name
}
} );
访问 app 的 xxx 就是在访问 app._data.xxx
Object.defineProperty( app, 'name', {
get() {
return app._data.name
},
set( newVal ) {
app._data.name = newVal;
}
} )
将属性的操作转换为 参数
function proxy( app, key ) {
Object.defineProperty( app, key, {
get() {
return app._data[ key ]
},
set( newVal ) {
app._data[ key ] = newVal;
}
} )
}
问题:
在 vue 中不仅仅是只有 data 属性, properties 等等 都会挂载到 Vue 实例上
function proxy( app, prop, key ) {
Object.defineProperty( app, key, {
get() {
return app[ prop ][ key ]
},
set( newVal ) {
app[ prop ][ key ] = newVal;
}
} )
};
// 如果将 _data 的成员映射到 实例上
proxy( 实例, '_data', 属性名 )
// 如果要 _properties 的成员映射到 实例上
proxy( 实例, '_properties', 属性名 )