属性描述符初探——Vue实现数据劫持的基础
// 定义一个简单的属性描述符
function defineReactive(obj, key, val) {
// 使用Object.defineProperty来定义属性
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter() {
console.log(`获取${key}:${val}`);
return val;
},
set: function reactiveSetter(newVal) {
if (newVal === val) return;
console.log(`设置${key}:${newVal}`);
val = newVal;
}
});
}
// 使用示例
const data = { };
defineReactive(data, 'message', 'Hello, Vue!');
// 测试属性的getter和setter
console.log(data.message); // 将会触发getter,输出:获取message:Hello, Vue! 并返回 'Hello, Vue!'
data.message = 'Hello, World!'; // 将会触发setter,输出:设置message:Hello, World!
这段代码定义了一个defineReactive
函数,它接受一个对象obj
、一个属性名key
和一个初始值val
。它使用Object.defineProperty
来定义一个可观察的属性,其中包括get
和set
方法。这样,每次访问或设置属性时,都会执行这些函数,从而实现对数据变化的监控。这是Vue实现数据劫持的基础。
评论已关闭