如何在Javascript中使用DOMStringMap?

如何在Javascript中使用DOMStringMap?,javascript,prototype,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方

我正在试验
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
似乎期望所有集合属性都是字符串,包括
\uuuu proto\uuu
属性。由于并非所有浏览器都支持
Object.setPrototypeOf
,因此我想找到一种方法来设置
DOMStringMap
\uuuuuu proto\uuuu
属性。有没有办法做到这一点


另外,我知道所有这些都涉及到可怕的Javascript实践,但我只是在尝试Javascript。这不会投入生产。

解释

\uuuu proto\uuuu
属性可以更改内部[[Prototype]],因为它有一个setter函数,当您指定一个值时会运行该函数

但是,
DOMStringMap
s有自己的setter,它与
\uuuuuu proto\uuuuu
的setter相对应:

如果
\uuuu proto\uuuu
的setter被隐藏,它将不会运行。因此,在
DOMStringMap
实例中,您不能使用
\uuuu proto\uuu
作为属性来更改[[Prototype]]

解决方案

您可以使用来访问的setter,并使用它

Object.getOwnPropertyDescriptor(Object.prototype,'.\uuu proto'.'集
.call(myDOMStringMap,{});

说明

\uuuu proto\uuuu
属性可以更改内部[[Prototype]],因为它有一个setter函数,当您指定一个值时会运行该函数

但是,
DOMStringMap
s有自己的setter,它与
\uuuuuu proto\uuuuu
的setter相对应:

如果
\uuuu proto\uuuu
的setter被隐藏,它将不会运行。因此,在
DOMStringMap
实例中,您不能使用
\uuuu proto\uuu
作为属性来更改[[Prototype]]

解决方案

您可以使用来访问的setter,并使用它

Object.getOwnPropertyDescriptor(Object.prototype,'.\uuu proto'.'集
.call(myDOMStringMap,{});

说明

\uuuu proto\uuuu
属性可以更改内部[[Prototype]],因为它有一个setter函数,当您指定一个值时会运行该函数

但是,
DOMStringMap
s有自己的setter,它与
\uuuuuu proto\uuuuu
的setter相对应:

如果
\uuuu proto\uuuu
的setter被隐藏,它将不会运行。因此,在
DOMStringMap
实例中,您不能使用
\uuuu proto\uuu
作为属性来更改[[Prototype]]

解决方案

您可以使用来访问的setter,并使用它

Object.getOwnPropertyDescriptor(Object.prototype,'.\uuu proto'.'集
.call(myDOMStringMap,{});

说明

\uuuu proto\uuuu
属性可以更改内部[[Prototype]],因为它有一个setter函数,当您指定一个值时会运行该函数

但是,
DOMStringMap
s有自己的setter,它与
\uuuuuu proto\uuuuu
的setter相对应:

如果
\uuuu proto\uuuu
的setter被隐藏,它将不会运行。因此,在
DOMStringMap
实例中,您不能使用
\uuuu proto\uuu
作为属性来更改[[Prototype]]

解决方案

您可以使用来访问的setter,并使用它

Object.getOwnPropertyDescriptor(Object.prototype,'.\uuu proto'.'集
.call(myDOMStringMap,{});
@Linksku我不这么认为。使用这种方法来polyfill
setPrototypeOf
@Linksku我不这么认为。使用这种方法来polyfill
setPrototypeOf
@Linksku我不这么认为。使用这种方法来polyfill
setPrototypeOf
@Linksku我不这么认为。使用此方法来polyfill
setPrototypeOf
[OverrideBuiltins]
interface DOMStringMap {
  getter DOMString (DOMString name);
  setter creator void (DOMString name, DOMString value);
  deleter void (DOMString name);
};