Object.freeze在URL searchParams.set()上不工作



是否有一种方法可以强制对象被重新创建/克隆,以便它专门用于URL对象?

我已经尝试使用Object.freeze(new URL('http://example.com)),但是,我仍然可以通过url.searchParams.set('a', 'b')添加和删除对象的searchParams。

我希望至少有一个会抛出错误:

// Using freeze()
const url = Object.freeze(new URL('http://example.com'))
url.searchParams.set('a', 'b')
console.log(url.toString())
// Using seal()
const url2 = Object.seal(new URL('http://example2.com'))
url2.searchParams.set('c', 'd')
console.log(url2.toString())
// Also freezing the searchParams
const url3 = Object.freeze(new URL('http://example3.com'))
Object.freeze(url3.searchParams)
url3.searchParams.set('e', 'f')
console.log(url3.toString())

我想有一种方法,如果使用frozen对象而不是克隆,则抛出错误。

这里有两个潜在的问题:

首先,冻结一个对象不会冻结它的子对象。它不是递归的。有很多递归工作的"深度冻结"函数的实现,MDN关于Object.freeze的文档就有一个。这可能在内置类型上工作,也可能不工作,其中一些属性是只读的(例如,您不能执行url.searchParams = <new value>,这会引发一个错误,这可能会破坏许多实现)。

其次,设置或修改冻结对象不会引发错误,除非你处于严格模式。否则,设置将静默失败。

最新更新