为何JavaScript对象属性赋值不生效?GotoMeeting类赋值问题咨询
问题分析与解决方案
我帮你梳理下代码里的几个关键问题,这就是你给gotomeeting.email赋值后,回调里的判断逻辑没触发的原因:
1. 回调函数的this指向错误
在getElement方法中,你创建的MutationObserver回调是普通function类型,这类函数内部的this默认不会指向GotoMeeting的实例(非严格模式下指向全局对象,严格模式下是undefined)。所以当你在外部给gotomeeting.email赋值后,回调里的this.email根本取不到你设置的实例属性值。
2. self变量的作用域问题
你在构造函数里声明了let self = this;,但这个变量的作用域仅限于构造函数内部,getElement方法里的回调函数根本访问不到它。回调里用到的self.clicked实际上是在访问全局变量self,这完全不是你想要的实例属性。
3. 一处容易忽略的赋值错误
回调里的self.clicked === true;是比较操作,不是赋值,应该写成self.clicked = true;,否则永远不会把clicked设为true。
修复后的代码示例
我把这些问题都修正了,你可以参考:
class GotoMeeting { constructor() { this.audioBtn = null; this.email = null; this.name = null; this.clicked = false; // 直接挂载到实例上,不需要额外的self } getElement() { // 在getElement内部保存实例引用,回调里可以访问到 const self = this; const target = document.body; const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; const mutation = new MutationObserver((mutations) => { // 改用箭头函数,继承外部的this mutations.forEach(function(mutation) { console.log(mutation.type); }); self.audioBtn = document.getElementById("select-audio-none"); const emailBtn = document.getElementById("join-email"); const nameBtn = document.getElementById("join-name"); const submitBtn = document.getElementById("join-submit"); if (self.audioBtn) { self.audioBtn.click(); } if (emailBtn && nameBtn) { // 这里用self访问实例的email和name属性 if (self.email !== null && self.name !== null) { emailBtn.value = self.email; nameBtn.value = self.name; if (!self.clicked && emailBtn.value && nameBtn.value) { submitBtn.click(); self.clicked = true; // 修正为赋值操作 console.log("it worked :)") } } else { setTimeout(()=>{checkDetail()},1000); // 注意:checkDetail函数需要确保存在 } self.triggerMouseEvent(nameBtn, "keydown"); } }); const config = { childList: true, subtree: true }; mutation.observe(target, config); } triggerMouseEvent(node, eventType) { const keyboardEvent = new KeyboardEvent(eventType); node.dispatchEvent(keyboardEvent); } } const gotomeeting = new GotoMeeting(); gotomeeting.getElement();
关键修改说明
- 去掉了构造函数里多余的
self变量,直接把clicked挂载到实例上。 - 在
getElement内部声明const self = this;,确保回调能访问到实例。 - 将MutationObserver的回调改为箭头函数,或者也可以继续用普通函数,但通过
self访问实例属性(两种方式选其一即可)。 - 修复了
self.clicked的赋值错误。
这样修改后,当你在外部执行gotomeeting.email = 你的响应数据和gotomeeting.name = 你的响应数据时,回调里就能正确读取到这些值,触发后续的提交逻辑了。
内容的提问来源于stack exchange,提问作者janaravi
相关产品推荐
相关产品推荐

