回答面试官版:
vue
实现双向数据绑定的原理就是利用了Object.defineProperty()
,这个方法重新定义了对象获取属性值get
和设置属性值set
的操作来实现的。
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
在vue3
中使用proxy
方法进行了重写。
代码分解版:
// 这是将要被劫持的对象
const data = {
name: ""
};
function say(name) {
if (name === "古天乐") {
console.log("给⼤家推荐⼀款超好玩的游戏");
} else if (name === "渣渣辉") {
console.log("戏我演过很多,可游戏我只玩贪玩懒⽉");
} else {
console.log("来做我的兄弟");
}
}
// 遍历对象,对其属性值进⾏劫持
Object.keys(data).forEach(function(key) {
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get: function() {
console.log("get");
},
set: function(newVal) {
// 当属性值发⽣变化时我们可以进⾏额外操作
console.log(`⼤家好,我系${newVal}`);
say(newVal);
}
});
});
data.name = "渣渣辉";
//⼤家好,我系渣渣辉
//戏我演过很多,可游戏我只玩贪玩懒⽉
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。