You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:02:14