如何在Javascript中使用DOMStringMap?

时间:2015-05-22 17:13:07

标签: javascript prototype

我正在试验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。这不会投入生产。

1 个答案:

答案 0 :(得分:2)

<强>解释

__proto__属性可以更改内部[[Prototype]],因为它有一个setter函数,当你赋值时它会运行。

但是,DOMStringMap有自己的setter,其中__proto__为阴影:

  

2.7.3 DOMStringMap

[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, {});