JavaScript中如何获取后续定义的对象成员值?
这是个典型的异步属性加载场景,刚好在RequireJS的模块化环境里经常遇到。给你几个靠谱的方案,都不用循环,也不会报错:
方案1:使用Proxy监听属性变化
ES6的Proxy可以帮你拦截对象的属性赋值操作,当n3被添加时自动触发回调,完美契合你的需求。代码示例如下:
// 把原始对象换成Proxy实例 var a = new Proxy({ n1: 1, n2: 2 }, { set(target, prop, value) { target[prop] = value; // 当设置的属性是n3时,执行你的业务逻辑 if (prop === 'n3') { handleN3Value(value); // 这里写拿到n3后要做的事 } return true; } }); // init.js中定义处理n3的函数 function handleN3Value(n3) { console.log('成功获取n3的值:', n3); // 后续业务逻辑... }
不管哪个异步脚本给a添加n3,只要执行a.n3 = xxx,Proxy的set陷阱就会触发,你就能立刻拿到最新值,完全不用循环,也不会有任何报错。
方案2:用自定义事件做跨脚本通信
如果需要兼容不支持Proxy的老环境,自定义事件是更通用的解耦方案。让添加n3的脚本主动通知init.js:
首先在init.js中监听事件:
// init.js document.addEventListener('n3Ready', function(e) { const n3Value = e.detail; console.log('成功获取n3的值:', n3Value); // 后续业务逻辑... });
然后在负责添加n3的异步脚本里,赋值后触发事件:
// 其他异步脚本 a.n3 = 3; // 给对象添加n3属性 // 触发自定义事件,把n3的值传递过去 const event = new CustomEvent('n3Ready', { detail: a.n3 }); document.dispatchEvent(event);
这个方案的优势是脚本间完全解耦,不用依赖Proxy特性,在RequireJS的模块化场景下非常好用。
方案3:封装Promise等待n3
如果你习惯用Promise风格的异步编程,可以结合Proxy封装一个等待逻辑:
var a = { n1: 1, n2: 2 }; let n3Resolve; const n3Promise = new Promise(resolve => { n3Resolve = resolve; }); // 用Proxy包装原始对象 a = new Proxy(a, { set(target, prop, value) { target[prop] = value; if (prop === 'n3') { n3Resolve(value); } return true; } }); // init.js中通过Promise获取n3 n3Promise.then(n3 => { console.log('成功获取n3的值:', n3); // 后续业务逻辑... });
这个方案适合已经用Promise链组织代码的场景,风格更统一。
另外补充:如果你只是临时获取n3(不需要等待它存在),直接写const n3 = a.n3;就好——访问对象不存在的属性只会返回undefined,不会报错,但这显然不是你要的核心需求,所以上面的异步方案才是重点。
内容的提问来源于stack exchange,提问作者shaandg
相关产品推荐
相关产品推荐

