访问document.createElement("a")原型属性时出现Illegal invocation错误求助
问题:访问HTMLAnchorElement原型的href属性触发Illegal invocation错误
我正在为学校编写自定义JavaScript控制台(学校禁用了检查工具),目前已完成大部分功能,但处理HTMLAnchorElement的stringify方法时出错。经排查,访问document.createElement("a")原型的属性时触发了Illegal invocation错误。
错误复现代码
const x = document.createElement("a"); const y = Object.getPrototypeOf(x); console.log(y["href"]);
正常运行的代码
const y = HTMLAnchorElement; console.log(y["href"]);
经排查,问题出在调用Object.getOwnPropertyDescriptor(Object.getPrototypeOf(document.createElement("a")), "href").get()时,没有正确绑定上下文。请问是否有修复方法(比如绑定this值)?
解决方案
这个错误的核心原因是:HTMLAnchorElement原型上的href是访问器属性(getter),它的执行依赖this指向一个具体的HTMLAnchorElement实例——href的值和具体元素实例绑定,原型本身不是可直接使用的元素实例,直接调用getter会导致this指向错误,从而触发Illegal invocation。
修复方法就是给getter绑定正确的this上下文(即具体的HTMLAnchorElement实例):
方法1:绑定到已创建的元素实例
const x = document.createElement("a"); const proto = Object.getPrototypeOf(x); const hrefGetter = Object.getOwnPropertyDescriptor(proto, "href").get; // 将getter的this绑定到具体元素实例x console.log(hrefGetter.call(x));
方法2:临时创建实例绑定上下文
如果场景中没有现成的元素实例,可以临时创建一个作为上下文:
const proto = Object.getPrototypeOf(document.createElement("a")); const hrefGetter = Object.getOwnPropertyDescriptor(proto, "href").get; // 临时创建实例作为this上下文 console.log(hrefGetter.call(document.createElement("a")));
补充说明
你提到的HTMLAnchorElement.href能正常运行,是因为这里访问的是构造函数的静态属性,它返回的是该属性的描述符对象,而非具体的href值,这也是它不会报错的原因。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

