我正在尝试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__
的DOMStringMap
属性的方法。有办法吗?P.s.我知道所有这些都涉及可怕的Javascript做法,但是我只是在尝试Javascript。这将不会投入生产。
最佳答案
说明__proto__
属性可以更改内部的[[Prototype]],因为它具有在分配值时运行的setter函数。
但是,DOMStringMap
有其自己的设置器,它们会遮盖__proto__
的设置器:
2.7.3 DOMStringMap
[OverrideBuiltins]
interface DOMStringMap {
getter DOMString (DOMString name);
setter creator void (DOMString name, DOMString value);
deleter void (DOMString name);
};
如果
__proto__
的设置程序被隐藏,则它将不会运行。因此,在DOMStringMap
实例中,不能使用__proto__
作为属性来更改[[Prototype]]。解
您可以使用
getOwnPropertyDescriptor
来访问__proto__
的设置器,并使用call
。Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set
.call(myDOMStringMap, {});