Javascript中的getter和setter初识
前言
本文主要给大家介绍的关于Javascript中getter和setter的相关内容,第一次听说这个东西的时候是vue.js里面的数据绑定,只要绑定了数据,修改对象属性可以自动反馈到dom上,很神奇,后面也看到了文档里面实现是对对象定义了getter和setter并覆盖原属性,索性就来总结这两者的用法,下面话不多说了,来一起看看详细的介绍吧。
原理
利用Object.defineProperty来重写对象属性为getter和setter,通过getter和setter顺便改变绑定DOM节点的值
例子
摘自MDN
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, 'temperature', {
get: function() {
console.log('get!');
return temperature;
},
set: function(value) {
temperature = value;
archive.push({ val: temperature });
}
});
this.getArchive = function() { return archive; };
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
利用这个MDN例子小小的写了个方法并写了个计时器的DEMO
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1 id="testTime" z:bind="time">0s</h1>
<script>
// 双向绑定
function bind_data(ele, arg){
var bindAttributeName = 'z:bind';
var data = JSON.parse(JSON.stringify(arg)) || {};
Object.keys(arg).forEach(function(argKey, index, array){
Object.defineProperty(arg, argKey, {
get: function(){
return data[argKey];
},
set: function(value){
if(ele.getAttribute(bindAttributeName) !== argKey) {
return;
}
if(ele.tagName === 'INPUT'){
ele.value = value;
}else{
ele.innerHTML = value;
}
data[argKey] = value;
}
});
arg[argKey] = arg[argKey];
});
var key = ele.getAttribute(bindAttributeName);
if((ele.tagName === 'INPUT' || ele.tagName === 'TEXTAREA') && arg[key]){
ele.addEventListener('input', function(e){
data[key] = ele.value;
});
}
}
/*
例子很简单,直接改变对象属性,就直接
反馈到了DOM上,就好像是一个钩子,改变
这个对象的属性,这个属性的钩子把它绑
定的DOM的数据进行修改
*/
var start = (new Date()).getTime();
var now;
var b = {time: '0s'};
bind_data(document.getElementById('testTime'), b);
setInterval(function(){
var now = (new Date()).getTime();
b.time = ((now - start)/1000) + 's'
}, 1);
</script>
</body>
</html>
参考
Object.defineProperty() - JavaScript | MDN
深入响应式原理 — Vue.js
总结
以上是 Javascript中的getter和setter初识 的全部内容, 来源链接: utcz.com/z/324738.html