注意:我已经搜索过这个错误,但我发现的一切都是关于调用函数的.我没有打电话给任何功能.我只是想要访问一个属性.
我执行这个简单代码时遇到错误:
var a = document.getElementById("something");
var b = Object.create(a);
console.log(b.baseURI) //Throws error with any property of aRun Code Online (Sandbox Code Playgroud)
<p id="something">Hi! I exist just for demo purposes. This error can occur with any element.</p>Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样.如果我试图从b... 的原型获取属性,代码工作正常
var a = document.getElementById("something");
var b = Object.create(a);
console.log( Object.getPrototypeOf(b.baseURI) ) //Works
Run Code Online (Sandbox Code Playgroud)
......还使用普通物体.
var a = {foo: "Foo!"};
var b = Object.create(a);
console.log(b.foo) //Works
Run Code Online (Sandbox Code Playgroud)
为什么会这样?对我来说完全是无稽之谈.MDN说:
在尝试访问对象的属性时,不仅要在对象上搜索属性,还要在对象的原型,原型的原型等上查找属性,直到找到具有匹配名称的属性或结束为止.到达了原型链.
b(在第一个例子中)的原型链是:
HTMLParagraphElement --> HTMLParagraphElement (the actual element object) --> HTMLParagraphElement --> HTMLElement --> Element --> Node --> EventTarget --> Object --> null
Run Code Online (Sandbox Code Playgroud)
(证明)
编辑:请注意,1个是如何ST在原链对象是HTMLParagraphElement.这是正常的,所以这不是问题.(图片)
问题(我认为)是礼仪被复制到主要b对象而不仅仅是b原型.这意味着浏览器在第一个对象中找到匹配的名称并尝试访问它,但它会引发错误.(图像 ;单击(...)错误结果).
但是,我仍然不明白为什么会发生这种情况,也不知道为什么会抛出错误.
此行为是由规范的实现引起的。这些 DOM 节点是所谓的“平台对象”,它们实现 getter 的方式与“普通”javascript 略有不同。
简而言之:如果没有额外的工作,它们就无法扩展。
var a = document.getElementById("something");
var b = Object.create(a);
Run Code Online (Sandbox Code Playgroud)
当访问baseURIof时,它指向的不是有效的“平台对象”。这会导致错误。通过访问它确实有效,因为它指向的是一个有效的“平台对象”。bthisbIllegal invocationprototypethisprototype
关于 Chrome 问题的评论更详细地解释了它,并且如果您确实需要它,还提供了解决方法:https://bugs.chromium.org/p/chromium/issues/detail ?id=495437#c7
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |