Object.defineProperty()方法中有两个方法,一个是get,一个是set,当变量读取的时候会自动执行get方法,当变量设置值的时候会自动执行set方法,比如在vue这种双向绑定的框架中,源码实现就用了Object.defineProperty()来进行劫持。举个例子
<div id="test">{{name}}</div>
我们页面上有如上代码,那怎么实现js中直接修改name的值让页面上的值也自动变化呢?这里我们就要借用牛逼的Object.defineProperty()
var Book = {}var name='';Object.defineProperty(Book, 'name', {set: function (value) {console.log('你取了一个书名叫做' + value);var test = document.getElementById("test");var value1 = test.innerHTML;value1 = value1.replace("{{name}}",value);test.innerHTML=value1;name=value1;},get: function () {return '获取了值'+name}});Book.name = 'vue权威指南'; // 会触发set方法console.log(Book.name); //会触发get方法
完整代码如下:
<!DOCTYPE html><html><head><meta charset="utf-8" /></head><body><div id="test">{{name}}</div></body><script>var Book = {}var name='';Object.defineProperty(Book, 'name', {set: function (value) {console.log('你取了一个书名叫做' + value);var test = document.getElementById("test");var value1 = test.innerHTML;value1 = value1.replace("{{name}}",value);test.innerHTML=value1;name=value1;},get: function () {return '获取了值'+name}});Book.name = 'vue权威指南'; // 会触发set方法console.log(Book.name); //会触发get方法</script></html>
执行就可以看到效果
