https://www.sweetjs.org库允许转换 JavaScript 代码。我想知道是否可以使用它以安全的方式扩展原生对象,如 Array、Object、String 等,而无需将任何东西附加到它们的原型上。
看起来 sweet.js 应该能够转换这个 JS 代码
{ a: 1 }.isEmpty()
进入
Extensions.isEmpty({ a: 1 })
实施可能是
Extensions.isEmpty = (o) => {
if ('isEmpty' in o) return o.isEmpty()
for (const k in o) if (o.hasOwnProperty(k)) return false
return true
}
但我不确定我应该在 Sweet.JS 中编写什么代码才能使其正常工作?
附言
使用 TypeScript 应该会更好。我们可以通过在下面给出错误声明来欺骗 TypeScript 认为我们的对象是扩展的,然后在 TypeScript 编译后应用 Sweet.JS 编译。
declare global {
interface Object {
isEmpty(): boolean
}
}
所以我们得到了所有正确的扩展类型,我们的原生对象将保持完全干净。