可以在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
来定义属性,他应该知道定义侦听器的其他方法