所以,从根本上来说,这个问题不是基于意见的。我认真客观地追寻这个问题,没有feeling大多产生于主流意见 - 为什么扩展本机对象是一种不好的做法?
这个问题是相关但未回答的问题:
如果使用 Symbol 属性扩展 Object.prototype,是否可以在没有专门设计的 API 来访问 JavaScript 中的 Symbol 的情况下破坏代码?
是否也应该避免通过符号扩展内置 Javascript 原型?
第一个问题已经关闭,因为他们说它是基于意见的,正如您在这个社区中可能知道的那样,一旦问题被禁止,无论我们如何修改它,版主都不会费心重新打开。这就是这里的运作方式。
对于第二个问题。由于某种未知的原因,尽管上下文相同,但该问题已得到更认真的对待,并且不被视为基于意见。
“不要修改不属于你的东西”规则有两个部分:
-
您可能会导致名称冲突,并且可能会破坏他们的代码。
通过触摸不属于您的东西,您可能会意外覆盖
其他一些库使用的东西。这将破坏他们的代码
意想不到的方式。
-
您可以创建紧密的依赖关系,它们可能会破坏您的代码。
通过将你的代码如此紧密地绑定到其他一些对象,如果它们使
一些重大更改(例如删除或重命名该类,例如
例如),你的代码可能会突然崩溃。
使用符号可以避免#1,但您仍然会遇到#2。通常不鼓励像这样的类之间的紧密依赖。如果其他班级曾经frozen,你的代码仍然会被破坏。这answers在此question仍然适用,只是原因略有不同。
另外,我读过意见(我们如何在没有“意见”基础的情况下在这里讨论这样的事情?),他们声称
a) 使用符号的库代码存在,并且他们可能会调整符号 API(例如Object.getOwnPropertySymbols())
b) 用Symbol 扩展对象属性与非Symbol 属性本质上没有什么不同。
在这里,对于不触及的主要理由Object.prototype
是由于#1,我看到的几乎所有答案都声称这一点,我们不必讨论是否没有符号使用。
然而,正如他们所说,使用符号会避免#1。因此,大多数传统智慧将不再适用。
然后,正如#2 所说,
通过将您的代码如此紧密地绑定到某个其他对象,如果它们做出一些重大更改(例如删除或重命名该类),您的代码可能会突然崩溃。
原则上,任何基本的 API 版本升级都会破坏任何代码。众所周知的事实与这个具体问题无关。 #2 没有回答问题。
只有相当一部分是Object.freeze(Object.prototype)
可能是剩下的问题。然而,这本质上与其他意外升级基本 API 的方式相同。
由于 API 用户不是 API 提供者,因此预期的 APIObject.prototype
is 没有冻结.
如果其他人接触了基本 API 并将其修改为冻结,那么就是他/她破坏了代码。他们在没有通知的情况下升级了基本 API。
例如,在 Haskell 中,有许多语言扩展。也许他们很好地解决了碰撞问题,最重要的是,他们不会“冻结”基本 API,因为冻结基本 API 会破坏他们的生态。
因此,我观察到Object.freeze(Object.prototype)
是反模式。不能理所当然地阻止Object.prototype
带符号的扩展。
这是我的问题。虽然我这样观察,但可以肯定地说:
如果是这样的话Object.freeze(Object.prototype)
不执行,这是反模式并且可检测,执行扩展是安全的Object.prototype
与符号?
如果您不这么认为,请提供一个具体的例子。