在elem.dataset上使用Object.defineProperty,但属性仍然是可更改的

时间:2015-08-23 09:26:38

标签: javascript html dataset configurable defineproperty

我正在尝试使用Object.defineProperty在canvas元素的数据集上设置不可更改的属性。在普通对象上,这很好。但是当我尝试在数据集对象上执行此操作时,该属性仍然可以更改。

<canvas id="can" style="outline:1px solid black"></canvas>

<script>
var can = document.getElementById("can");
var obj = {};
Object.defineProperty(can.dataset,"id",{value:2,configurable:false});
Object.defineProperty(obj,"id",{value:4,configurable:false});

can.dataset.id = 55;
console.log(can.dataset.id) //Returns "55" as a string

obj.id = 55;
console.log(obj.id) //Returns 4 - unchanged

</script>

使用writable:false也无法解决问题。 有没有办法解决这个问题,它是一个bug,我不应该以这种方式使用Object.defineProperty吗?

1 个答案:

答案 0 :(得分:1)

主机提供的对象不需要支持JavaScript定义的完整对象功能集。此外,dataset被指定为DOMStringMap well-defined semantics。你要做的是让它不遵循那些语义。如果它有效,可以说 将是一个bug;不起作用的是主持人维护对象的定义行为。