因此,从根本上说,这个问题不是基于观点的.我认真地客观地研究这个问题,没有feeling个主要来自predominant opinion-Why is extending native objects a bad practice?
这个问题是相关但尚未回答的问题:
Should the extension of built-in Javascript prototypes through symbols also be avoided?
第一个问题已经结束了,因为他们说这是基于观点的,你可能知道,在这个社区,一旦一个问题被禁止,不管我们如何修改它,版主永远不会费心重新打开.这就是这里的工作方式.
关于第二个问题.由于一些未知的原因,这个问题被更加严肃地对待,虽然背景相同,但并不被认为是基于观点的.
"不要修改你不拥有的东西"规则分为两部分:
-
您可能会导致名称冲突,也可能会 destruct 它们的代码.
通过touch 你不拥有的东西,你可能会意外地覆盖它
-
你可以创建紧密的依赖关系,它们会 destruct 你的代码.
通过将代码与其他对象紧密绑定,如果它们
使用符号可以避免#1,但仍然会遇到#2.这样的类之间的紧密依赖通常是不被鼓励的.如果另一个类的值为frozen,那么代码仍然会中断.question上的answers仍然适用,只是原因略有不同.
此外,我也读过意见书(如果没有"意见"基础,我们怎么能在这里讨论这样的事情?),他们声称
a) 存在使用符号的库代码,它们可能会调整符号API(例如Object.getOwnPropertySymbols())
b) 用符号扩展对象属性与非符号属性没有本质区别.
在这里,因为非接触Object.prototype
的主要理由是因为#1,我看到的几乎所有答案都声称这一点,我们不必讨论是否存在符号用法.
然而,正如他们所说,使用符号将避免#1.因此,大多数传统智慧将不再适用.
然后,正如#2所说,
通过将代码与其他对象紧密绑定,如果它们进行了一些重大更改(例如删除或重命名类),代码可能会突然中断.
原则上,任何基本的API版本升级都会 destruct 任何代码.众所周知的事实与这个具体问题无关#2没有回答这个问题.
剩下的问题只有相当一部分是Object.freeze(Object.prototype)
.然而,这本质上与其他人升级基本API的方式相同.
由于API用户不是API提供者,预期的API为Object.prototype
是not frozen.
如果其他人触动了基本的API并将其修改为冻结,则是他/她 destruct 了代码.他们在没有通知的情况下升级了基本API.
例如,在Haskell中,有许多语言扩展.他们可能很好地解决了冲突问题,最重要的是,他们不会"冻结"基本API,因为冻结基本API会阻止他们的eco.
因此,我观察到Object.freeze(Object.prototype)
是反模式.不能理所当然地阻止Object.prototype
用符号扩展.
这是我的问题.尽管我这样观察,但可以安全地说:
如果没有执行Object.freeze(Object.prototype)
,这是反模式和可检测的,那么使用符号执行扩展Object.prototype
是安全的吗?
如果你不这么认为,请提供一个具体的例子.