“Object.freeze(Object.prototype)”仅仅是用符号扩展“Object.prototype”的危险吗?

2023-12-12

所以,从根本上来说,这个问题不是基于意见的。我认真客观地追寻这个问题,没有feeling大多产生于主流意见 - 为什么扩展本机对象是一种不好的做法?

这个问题是相关但未回答的问题:

如果使用 Symbol 属性扩展 Object.prototype,是否可以在没有专门设计的 API 来访问 JavaScript 中的 Symbol 的情况下破坏代码?

是否也应该避免通过符号扩展内置 Javascript 原型?

第一个问题已经关闭,因为他们说它是基于意见的,正如您在这个社区中可能知道的那样,一旦问题被禁止,无论我们如何修改它,版主都不会费心重新打开。这就是这里的运作方式。

对于第二个问题。由于某种未知的原因,尽管上下文相同,但该问题已得到更认真的对待,并且不被视为基于意见。

“不要修改不属于你的东西”规则有两个部分:

  1. 您可能会导致名称冲突,并且可能会破坏他们的代码。

    通过触摸不属于您的东西,您可能会意外覆盖 其他一些库使用的东西。这将破坏他们的代码 意想不到的方式。

  2. 您可以创建紧密的依赖关系,它们可能会破坏您的代码。

    通过将你的代码如此紧密地绑定到其他一些对象,如果它们使 一些重大更改(例如删除或重命名该类,例如 例如),你的代码可能会突然崩溃。

使用符号可以避免#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与符号?

如果您不这么认为,请提供一个具体的例子。


安全吗?是的,如果您意识到随之而来的所有危险,并且要么选择忽略它们、耸耸肩,要么投入精力确保它们不会发生(测试、兼容性要求的清晰文档),那么它就是安全的。请随意在您自己的代码中执行此操作,这样您就可以保证这些事情。

这是不是一个好主意?仍然没有。不要在其他人将(必须)使用的代码中引入此内容。

如果其他人接触了基本 API 并将其修改为冻结,那么就是他/她破坏了代码。因此,我观察到Object.freeze(Object.prototype)是反模式。

不完全的。如果你们都做了一些不应该做的事情,那么你们都有责任——即使只做了其中一件事情就可以正常运行代码。这正是#2 的含义:不要将代码与与其他人共享的全局对象紧密耦合。

然而,这些事情之间的区别在于冻结原型 is an 既定惯例 to 强化应用程序反对原型污染攻击通常效果很好(除了one bit), 而使用自己的方法扩展原型被广泛认为是一种不好的做法(正如您已经发现的那样)。

在 Haskell 中,有很多语言扩展。也许他们很好地解决了碰撞问题,最重要的是,他们不会“冻结”基本 API,因为冻结基本 API 会破坏他们的生态。

Haskell 没有任何全局的、共享的、可变的对象,所以整个问题有点不同。唯一的冲突问题是来自“明星导入”模块的标识符之间的冲突,包括来自baseAPI。但是,这是每个模块的,而不是全局的,因此它不会破坏可组合性,因为您可以将相同的标识符解析为单独模块中的不同函数。

也是的,他们的baseAPI被冻结和版本控制,因此他们可以在不破坏旧应用程序的情况下对其进行改进(可以继续使用旧的依赖项和旧的编译器)。这是 JavaScript 所不具备的奢侈。

延长期限是否安全Object.prototype with a pipe符号使得something[pipe](f) does f(something), like something |> f在 F# 中还是之前的管道运算符提案?

不,这不安全,不适用于任意值something。一些明显不起作用的值是null and undefined.

然而,它甚至不适用于所有对象:有些对象没有Object.prototype在他们的原型链上。一个例子是Object.create(null) (also 出于安全目的而完成),另一个例子是来自其他领域的对象(例如 iframe)。这也是原因为什么你不应该期待.toString()对所有对象进行操作.

因此,对于您的管道运算符,最好使用静态独立方法,或者仅使用转译器来获取您真正想要的语法。一个Object.prototype方法只是一个不好的近似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“Object.freeze(Object.prototype)”仅仅是用符号扩展“Object.prototype”的危险吗? 的相关文章

  • 如果对象包含在另一个数组中,则从数组中删除该对象

    我试图从数组中删除一个对象 如果该对象的属性 唯一 包含在另一个数组中 我知道我可以像这样执行嵌套 for 循环 for i 0 i lt array length i for j 0 j lt array2 length j if arr
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • 如何在ASP.NET Webform中使用Jquery表单插件?

    我遇到了这个插件 http malsup com jquery form getting started http malsup com jquery form getting started 我想知道如何在 ASP NET WebForm
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable

随机推荐

  • auto_ptr 与 swig

    我正在尝试包装一个使用 auto ptr 的 C 库 我正在使用痛饮 并想要生成 python 绑定 我看过 swig 文档中关于如何将 swig 与智能指针一起使用的部分here 但我无法让它发挥作用 Swig 生成想要使用 const
  • pascal 中使用的集合的实现是什么?

    我想知道语言提供的 pascal 中集合类型的实际实现 特别是 我想知道 freepascal 运行时库中使用的库 但我对任何 pascal 实现都很感兴趣 我关心它的运行时复杂性 的最佳实现不相交集数据结构 are in O log n
  • 如何将 Mapbox SDK 与 SwiftUI 集成

    我将 Mapbox SDK 安装到我的项目中 但我不明白如何将此代码片段与SwiftUI 我创建了一个 SwiftUIView named MapView 我在其中导入 Mapbox 框架 我尝试使用UIViewRepresentable协
  • MySQL LEFT JOIN 3 个表

    我有3张桌子 Persons PersonID Name SS Fears FearID Fear Person Fear ID PersonID FearID 现在我想列出每个与他们相关的恐惧的人 可以是多种恐惧 也可以没有 即使一个人没
  • 为什么 com.typesafe.slick#slick_2.11;2.0.2: not find 出现 UNRESOLVED DEPENDENCIES 错误?

    我正在尝试从类型安全激活器运行 hello slick 示例 当我输入 run 时 我在 sbt 中创建一个项目 它给出了以下错误 warn warn UNRESOLVED DEPENDENCIES warn warn com typesa
  • 循环遍历文件以计算字段数

    我有一个 bash 脚本来从 txt 文件添加用户 这真的很简单 name firstname uid gid 空格分隔值 我想用 awk 检查每行是否包含 4 个字段 如果是我想返回1 如果不是返回0 file my file txt a
  • 谷歌地图:与用户一起顺利移动标记和地图?

    一旦用户打开该功能并直至终止它 我必须在谷歌地图中显示实时 实时用户移动位置 我已经使用下面的方法来为标记设置动画 private void animateMarker final Marker marker final LatLng to
  • ClickOnce 不遵守本地主机的安装文件夹

    我正在测试 ClickOnce 应用程序部署 我已经在我的机器上设置了一个虚拟目录 运行 IIS 我已指定http localhost SampleApplication作为 Visual Studio 的 发布 选项卡中的安装文件夹 UR
  • 在 AngularJS 中处理转换后的数据

    我有一个时间戳列表 我可以用 AngularJS 列出它们 不过我想将其列为日期字符串 这些日期字符串应该是可编辑的 完成后我也希望更新相关的时间戳 我的第一个问题是 AngularJS 以不同格式 过滤器 呈现项目并仍然具有双向数据绑定的
  • VIM 浏览器插件对文件执行命令

    我正在尝试 NERDtree 它非常酷 但我想做的是在所选文件上执行特殊命令或脚本 例如 我想突出显示树中的一个图像文件 按某个键并在原始文件中插入适当的 XHTML 标签 我有一个小脚本来进行格式化 我只需要在文件上运行它 或者在选择模块
  • Qt 事件和信号/槽

    在Qt世界中 事件和信号 槽有什么区别 一个会取代另一个吗 事件是信号 槽的抽象吗 在 Qt 中 信号和事件都是观察者模式 它们用于不同的情况 因为它们有不同的优点和缺点 首先 让我们准确定义 Qt 事件 的含义 Qt 类中的虚函数 如果您
  • Flutter FormatException:意外的字符(在字符 1 处)

    在 flutter 中 我使用一个 php 文件 该文件从数据库查询返回 json 响应 但是当我尝试解码 json 时 我收到此错误 E flutter 8294 ERROR flutter lib ui ui dart state cc
  • Jquery选择图像

    首先 我是 Jquery 的新手 我有这样的图像 我想要的是 当用户单击图像时 它会使图像带有边框 用户可以选择多个图像 选择时所有内容都必须带有边框 单击按钮后 我将获得图像 ID tr img src urlofimage tr gt
  • 比较两个文件在 python 中报告的差异

    我有 2 个名为 hosts 的文件 位于不同的目录中 我想使用 python 比较它们 看看它们是否相同 如果它们不相同 我想在屏幕上打印差异 到目前为止我已经尝试过这个 hosts0 open dst1 hosts r hosts1 o
  • Mapbox - 来自 GeoJson 属性的自定义标记图标

    我正在从一组 GeoJson 对象渲染标记 我想使用自定义图标作为标记 但无法确定正确的语法 下面是我用来渲染 geojson 的部分代码 asGeoJson gt type Feature properties title get lis
  • 快速通过segue传递数组

    我已经努力几天了 从我的数组中传递一个数组SecondViewController to my FirstViewController使用斯威夫特 从我的研究中我发现segue with prepareForSegue将是一个可行的选择 但
  • EXCEL VBA:如何使用 isString 或 isNumeric 验证值?

    下面是我的代码 Dim m As String n As Long n InputBox Enter sales amount If n lt 500 Or n gt 5000 Then ActiveCell Value n ActiveC
  • 操作列表内的数据框

    这可能是一个简单的问题 但我一直找不到答案 我想删除列表内数据帧的一列 x1 lt rnorm 100 0 1 x2 lt rnorm 100 0 1 x3 lt rnorm 100 0 1 x4 lt rnorm 100 0 1 df1
  • 使用 JavaScript/jQuery 捕获输入框内容的所有更改

    我有一个带有输入框的页面 以及一个处理该输入框的值并生成一段文本的函数 我希望该文本始终与输入框的内容相关 因此我使用 jQuery 附加了几个事件处理程序以捕获任何更改 input bind keyup cut paste functio
  • “Object.freeze(Object.prototype)”仅仅是用符号扩展“Object.prototype”的危险吗?

    所以 从根本上来说 这个问题不是基于意见的 我认真客观地追寻这个问题 没有feeling大多产生于主流意见 为什么扩展本机对象是一种不好的做法 这个问题是相关但未回答的问题 如果使用 Symbol 属性扩展 Object prototype