JavaScript监听一个变量的变化

本文介绍了JavaScript监听变量变化的方法,当变量值改变时可执行相应函数,类似前端框架的数据绑定功能。详细讲解了Object.defineProperty和Object.defineProperties两个函数,前者可修改或定义单个属性,后者能一次性配置多个属性,还提到了属性描述符的配置。

JavaScript监听一个变量的变化

监听变量,当变量的值发生改变时执行相应的函数。就类似于我们现在主流前端框架中数据绑定功能一样,通过修改对应变量的数据,数据发生改变后调用相应的函数进而改变视图

Object.defineProperty

Object.defineProperty()是一个用于修改已有属性或为对象定义新属性的函数

Object.defineProperty(obj, prop, desc)
参数名类型描述可否省略
objobject需要定义属性的对象
propstring要定义或修改的属性名
descobject属性的描述符(配置)

下面就是desc属性描述符的一些配置项,我们了解到可以通过为描述符里的getset设置对应的gettersetter函数来实现对数据读取或者赋值时的监听,并执行对应的函数

名称类型描述默认值
valueobject属性的值undefined
writablebool属性是否可以修改false
enumerablebool属性是否可以被循环遍历枚举false
configurablebool属性是否可以删除,描述符是否可以配置false
getfunction属性被读取时调用的函数undefined
setfunction属性被赋值时调用的函数undefined

下面将通过对对象tooltype属性进行监听,当读取或者修改type时会在控制台输出

var tool={
    type:'pointer'//object一开始没有任何属性也可以
}
Object.defineProperty(tool,'type', {
    configurable:true,
    set:function(newVal){
       this._type=newVal 
        console.log('set:'+this._type)
    },
    get:function(){
        console.log('get:'+this._type)
        return this._type
    }
})

必须要注意的是其中type已经被我们配置了gettersetter方法,不用用于存值了,所以需要其他变量带存储type的值,这里采用的是_原来的变量名的形式,以_开头在变量在一些javascript编程规范中约定俗成为私有的变量,刚好可以用于新属性的存值

//通过对属性进行赋值和读取来触发相应的函数
tool.type="brush"//	> set:brush
var type=tool.type//> get:brush

Object.defineProperties

Object.defineProperties()Object.defineProperty是一个用于修改已有属性或为对象定义新属性的函数,不过它一次性对多个属性进行配置

Object.defineProperty(obj, desc)
参数名类型描述可否省略
objobject需要定义属性的对象
descobject多个属性的描述符(配置)

描述符和上面一样,只不过desc将包含不止一个新属性的描述符配置

var tool={
    type:'pointer'//object一开始没有任何属性也可以
    color:"#ffffff"
}
Object.defineProperty(tool,{
    type: {
        configurable:true,
        set:function(newVal){
           this._type=newVal 
            console.log('set:'+this._type)
        },
        get:function(){
            console.log('get:'+this._type)
            return this._type
        }
    },
    color: {
        configurable:true,
        set:function(newVal){
           this._color=newVal 
            console.log('set:'+this._color)
        },
        get:function(){
            console.log('get:'+this._color)
            return this._color
        }
    }
})

文章参考过一下内容
深入浅出Object.defineProperty()

### 在 Vue 3 中使用 `watch` 监听变量变化并刷新页面 在 Vue 3 的 Composition API 中,`watch` 是一个强大的工具,用于监听响应式数据的变化。为了实现监听变量变化后刷新页面的功能,可以通过以下方式实现: #### 使用 `watch` 监听变量变化 通过 `watch` 方法监听响应式变量变化,并在回调函数执行刷新页面的操作。 ```javascript import { ref, watch } from 'vue'; const count = ref(0); watch(count, (newVal, oldVal) => { console.log(`count 变化:${oldVal} → ${newVal}`); // 刷新页面逻辑 location.reload(); // 使用 location.reload() 强制刷新页面 }); ``` 上述代码展示了如何监听 `count` 的变化,并在变化调用 `location.reload()` 方法刷新页面[^2]。 #### 深度监听复杂对象 如果需要监听复杂对象内部属性的变化,可以使用 `deep` 选项。例如: ```javascript import { reactive, watch } from 'vue'; const state = reactive({ user: { name: 'John', age: 30 } }); watch( () => state.user, (newUser, oldUser) => { console.log('用户信息发生变化', newUser, oldUser); location.reload(); // 刷新页面 }, { deep: true } // 启用深度监听 ); ``` 此示例展示了如何深度监听嵌套对象的变化,并在变化刷新页面[^3]。 #### 监听多个变量 如果需要同监听多个变量变化,可以将它们作为数组传递给 `watch` 方法: ```javascript import { ref, watch } from 'vue'; const name = ref('Alice'); const age = ref(25); watch([name, age], ([newName, newAge], [oldName, oldAge]) => { console.log(`name 从 ${oldName} 变为 ${newName}, age 从 ${oldAge} 变为 ${newAge}`); location.reload(); // 刷新页面 }); ``` 此代码片段展示了如何同监听多个变量变化,并在任意一个变量变化刷新页面。 #### 配置选项 `watch` 方法支持多种配置选项,例如: - `immediate`: 是否在初始化立即执行回调函数。 - `deep`: 是否启用深度监听。 - `flush`: 控制回调函数执行机(`pre`、`post` 或 `sync`)。 例如,启用 `immediate` 选项可以在初始化立即执行回调函数: ```javascript watch(count, (newVal, oldVal) => { console.log(`count 变化:${oldVal} → ${newVal}`); location.reload(); // 刷新页面 }, { immediate: true }); ``` 此示例展示了如何在初始化立即执行回调函数,并在变量变化刷新页面。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值