我正在尝试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, {});

08-19 15:12