可以在Javascript中监听基元类型的值更改吗?
假设我想在没有任何框架的情况下实现双向数据绑定。我知道它可以通过几种方法实现,比如可以在Javascript中监听基元类型的值更改吗?,javascript,Javascript,假设我想在没有任何框架的情况下实现双向数据绑定。我知道它可以通过几种方法实现,比如Object.defineProperty()或Proxy。但是,所有这些方法都需要对对象的属性进行更改,如obj.a='newvalue'。是否可以直接观察变量的变化,以便在其他地方调用name='newvalue'时执行自己的代码 // A string variable var name = 'some value'; function nameChanged(newValue) { document
Object.defineProperty()
或Proxy
。但是,所有这些方法都需要对对象的属性进行更改,如obj.a='newvalue'
。是否可以直接观察变量的变化,以便在其他地方调用name='newvalue'
时执行自己的代码
// A string variable
var name = 'some value';
function nameChanged(newValue) {
document.getElementById('name').value = newValue;
}
// magic goes here...
...
name = 'new value' // nameChanged() is automatically called.
不可以。Javascript不允许您钩住该操作。例如,在
python
中,可以使用类似\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但同样在python中,您需要构建自己类型的对象(类),然后您可以决定它发生了什么
例如,创建一个类Person
,然后创建所需的方法,在该方法中,您可以随心所欲
class Person {
constructor(name) {
this.name = name;
}
setName(name) {
//Whatever it is you wanna do
this.name = name;
}
}
您可以将变量定义为函数,并在调用函数时执行任务
const NAME = 123;
const _name = (value = NAME) => {
if (value !== NAME) {
// do stuff
};
return value
};
根据您所处的作用域(我假设您只是在全局作用域上),您可以使用对象。定义属性
,并将目标对象设置为窗口
Object.defineProperty(窗口“name”{
得到(){
返回此。\u名称;
},
设置(值){
if(值===此.name){
//没变所以就回来了
返回;
}
var oldValue=this.name;
这个._name=value;
log(`Changed'name'从${oldValue}更改为${value}`);
}
});
名称='测试';
名称='test2';
名称='test2';
console.log(名称)
无法读取代理
或对象。defineProperty
但基于此,所有这些方法都要求对对象的属性进行更改,为什么您不能这样做,因为全局变量只是窗口
对象的属性?名称是全局的吗?然后试着听一下全局.name
更改(我猜这将是窗口
),如果不是,那么你必须决定只使用原语值是否有意义(根据你想要实现的,我认为这没有意义)name
是窗口的名称。可能重复的名称很难满足他的要求,根据变量的范围,可以实现他想要实现的目标,但尚未共享yet@Icepickle我不同意。他实际上是在要求钩住修改变量的操作,而不一定是对象的属性。实际上,根据范围的不同,它可能只是窗口的属性(因为全局范围中定义的所有变量都成为窗口对象的一部分)是的,但是如果你在不同的上下文中创建了一个变量,你想听听这个怎么办?你本质上是在使自己依赖于某个对象。当然,我并没有对此提出异议,我只是提到依赖于范围,他可以使用window
来定义属性,他应该知道定义侦听器的其他方法