在元素上使用Object.defineProperty.数据集,但属性仍然是可更改的

Using Object.defineProperty on elem.dataset, but property is still changable

本文关键字:属性 仍然是 可更改 数据集 defineProperty 元素 Object      更新时间:2023-09-26

我试图使用Object.defineProperty在画布元素的数据集上设置一个不可更改的属性。在一个正常的对象上,这工作得很好。但是当我尝试在数据集对象上这样做时,属性仍然是可变的。

<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以这种方式?

主机提供的对象不需要支持JavaScript定义的全部对象特性。此外,dataset被指定为具有良好定义语义的DOMStringMap。你要做的就是让它不符合这些语义。如果它工作,可以说将是一个bug;不工作是主机维护对象的定义行为。