我正在试验DOMStringMap
对象,我不明白它是如何工作的。我试图改变DOMStringMap
对象的原型,但它表现得很奇怪:
Object.setPrototypeOf(element.dataset,{}); // sets prototype properly
element2.__proto__={}; // sets prototype to "[object Object]" in Chrome; in FireFox, nothing happens
如果我更改了toString
方法:
Object.prototype.toString=function(){
return this;
}
element3.__proto__={}; // TypeError: Cannot convert object to primitive value
DOMStringMap
似乎期望所有设置属性都是字符串,包括__proto__
属性。由于并非所有浏览器都支持Object.setPrototypeOf
,我想找到一种方法来设置__proto__
的{{1}}属性。有办法吗?
P.S。我知道所有这些都涉及可怕的Javascript实践,但我只是在尝试使用Javascript。这不会投入生产。
答案 0 :(得分:2)
<强>解释强>
__proto__
属性可以更改内部[[Prototype]],因为它有一个setter函数,当你赋值时它会运行。
但是,DOMStringMap
有自己的setter,其中__proto__
为阴影:
[OverrideBuiltins] interface DOMStringMap { getter DOMString (DOMString name); setter creator void (DOMString name, DOMString value); deleter void (DOMString name); };
如果__proto__
的setter被遮蔽,它就不会运行。因此,在DOMStringMap
个实例中,您无法使用__proto__
作为属性更改[[Prototype]]。
<强>解决方案强>
您可以使用getOwnPropertyDescriptor
访问__proto__
的二传手,以及call
。
Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set
.call(myDOMStringMap, {});