我可以决定调用不存在的对象方法时会发生什么吗?

2023-11-29

我的代码如下所示:

obj.foo(); // obj might, or might not have a `foo` method.

我想知道我是否可以覆盖发生的情况obj.foo在我的代码中被调用,例如:

obj.foo = function(){ alert ("Hello"); });
obj.onCallNonExistentMethod = function(){ // I know this is imaginary syntax
    alert("World");
}
obj.foo(); // alerts "Hello"
delete obj.foo;
obj.foo(); // alerts "World" , would TypeError without the method missing handler.

据我了解,在 Ruby 中这将是method_missing or const_missing或类似的东西。

我可以重写在 JavaScript 中调用不存在的对象方法时发生的情况吗?如果可以的话我该怎么做?

目标是验证我向用户提供的 API,以便他们可以安全地使用该 API,并且我可以更清楚地警告他们错误。


两年前,本杰明,你还不太了解行为类型的概念,是吗?

你很幸运,你很快就会意识到接口不是结构化的自从写这个问题以来,在 JavaScript 中,甚至写了一个库这解决了您在这里所说的确切问题,只是永远不要使用它。

所以,回答你的问题:

  • 是的,这是完全有可能做到的。
  • 对于您给出的情况,您可能不应该这样做。

怎么做

如果您只需要通过以下方式支持非常非常(非常非常)的新浏览器,那么这是完全可行的代理API.

var realObject = { foo: function(){ alert("Bar"); }); // our fooable api
var api = new Proxy({}, {
    get: function(target, name){
        if(name in target){ // normal API call
            return target[name]; 
        }
        // return whatever you want instead of the method:
        return function(){ alert("Baz"); });
    }
});
api.foo(); //alerts Bar
api.bar(); //alerts Baz
api.IWillNotBuyThisRecordItIsScratched(); // alerts Baz

因此,虽然浏览器支持非常不稳定,但

为什么你不应该

接口传达行为,上面的情况(例如拼写错误)通常可以(并且应该)被 jshint 或 ternjs 等静态分析工具捕获。

检查拼写错误的工具根本不足以传达 JavaScript 中的行为,类型检查通常被认为是一种反模式 - 在 JavaScript、Ruby 和 Python 等语言中,您知道将获得的类型。

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

我可以决定调用不存在的对象方法时会发生什么吗? 的相关文章

  • Chrome 扩展:browserAction.onClicked.addListener() 未被调用

    我正在尝试编写一个非常简单的 Chrome 扩展 此时 它只是一个弹出 html 文件 当单击浏览器操作图标时 该文件会尝试显示警报 我显然做错了什么 因为警报没有触发 清单 json name Simple description Sim
  • 未捕获的引用错误:i 未定义

    我正在尝试在我的数组上创建一个 for 循环 var lists a b c d JS for i 0 i lt lists length i console log lists i sa report btn lists i click
  • 使用material-ui@next 和 typescript 扩展主题

    创建我的主题时material ui我添加了两个新的调色板选项 为我提供了更好的明暗范围 我已经延长了Theme键入以表明这一点 import Theme from material ui styles import Palette fro
  • 在 Cypress 中提取部分文本

    我是 Cypress 的新手 我需要从我的应用程序中提取文本的动态部分 div Hello World greeting number 9123 div 在此示例中 我需要从 div 中提取 9123 以便稍后在测试中使用 知道我应该怎么做
  • react-dom/server 可以在客户端工作吗?

    我需要在客户端呈现顶级 html 标签 例如 结果将被注入到 iframe 中 在服务器上 我会使用renderToStaticMarkup函数来自react dom server 但仅限客户端react dom没有这个功能 Will re
  • d3 树 - 有相同孩子的父母

    我一直在将代码从 JIT 转换为 D3 并使用树布局 我已经复制了代码http mbostock github com d3 talk 20111018 tree html http mbostock github com d3 talk
  • 在 JavaScript 中解析日期时间字符串

    有谁知道如何解析所需格式的日期字符串dd mm yyyy See Mozilla Core JavaScript 参考 日期对象 https developer mozilla org en Core JavaScript 1 5 Refe
  • 在 Cytoscape.js 中为家谱设置边缘样式

    我有一个使用 Django 的家谱应用程序 我正在尝试使用http js cytoscape org http js cytoscape org对于用户界面 我想设置之间的边缘样式浪漫的伴侣像这样 http www eprintableca
  • 添加数组的总和。显示1个输出

    更新 这个问题的答案如下 感谢在不同线程上进行的 dougtesting 将数组相加 显示总和 https stackoverflow com questions 45724641 add array together display su
  • HTML5 Audio Element 无法在 IOS 11 设备上的 safari 中播放 mp3 直播

    我是一家广播公司的网络开发人员 自 iOS 11 发布以来 我们收到了一些用户投诉 称我们的音频直播流无法再在 IOS 11 设备上播放 为了将流嵌入我们的网站 我们使用 HTML5 AudioElement 在 iOS 11 的 iPho
  • Antd datepicker (date.clone/date.load 不是函数)

    我有一个反应应用程序 有一个复选框可以禁用日期选择器 但当我使用复选框禁用它时 我无法选择任何日期 如果我删除复选框及其功能 则不会出现错误 目前 我得到 date clone 不是函数 error const dateFormat YYY
  • 如何检查字符串中是否存在阿拉伯字符(javascript)

    如何用javascript语言检查字符串中是否存在阿拉伯字符 根据维基百科 http en wikipedia org wiki Basic Multilingual Plane 阿拉伯字符属于 Unicode 范围 0600 06FF 因
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • jQuery 删除函数真的删除 Dom 元素吗?

    我真的想知道 jQuery 是否remove http api jquery com remove 函数确实从 DOM 中删除元素 首先 我看了here https stackoverflow com questions 2185760 j
  • PHP:在执行 php 脚本时显示“正在加载”页面

    这就是我现在所拥有的 我有一个网页 当访问该网页时 它会通过开放 API 连接到 Surveygizmo com 检索大量数据 然后将这些数据返回给我进行处理 此过程大约需要 10 12 秒 在执行时 页面只是处于 正在加载 状态 并且我会
  • 需要将焦点放在react中的div上

    我有一个之前用 H1 标签包裹的文本 页面加载后 我需要专注于该文本 为了方便起见 我将它包装在 div 中 render const translate billing primaryContactSelection true this
  • 如何使 Meteor 上的服务器可以访问文本文件

    我很惊讶我无法在这里搜索我的答案 似乎没有其他人遇到这个问题 当您运行meteor服务时 js html等被打包在 meteor local build文件夹中 但它似乎排除了不是js或html的内容 我有一个名为 magicsets 的文
  • 在 gulp 和 browsersync 问题中观看新文件

    我使用 browsersync 在文件更改时重新加载浏览器 而且它工作完美 但是当我创建新文件 例如 html scss js 时 bowsersync 不起作用 如何解决这个问题 gulpjs Browser Sync gulp task
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • ExtJS:简单表单忽略 formBind

    我有一个小问题让我发疯了好几天 我有一个表单面板 Ext define EC view PasswordPanel extend Ext form Panel alias widget pwdpanel bodyPadding 15 ini

随机推荐

  • 错误栏末端缺失

    示例代码如下 require ggplot2 stats lt data frame Day 0 5 Mean c 3 2 2 7 0 8 0 2 0 0 Q10 0 0 Q90 c 7 48 4 0 2 2 1 2 0 0 plot lt
  • MSI升级并保留注册表项?

    我们在该领域有一个产品 1 0 我正在尝试更新该产品的安装程序 以便它可以安装旧版本 安装新版本 2 0 我正在使用 Visual Studio 2010 安装项目来执行此操作 我维护了 UpgradeCode 并将删除早期版本设置为 tr
  • 如何获得在C#中编辑app.config的管理员权限?

    我有一个程序 它使用 app config 来存储一些首选项 问题是 如果该程序安装在C program files 那么更改首选项是不可能的 因为所有文件程序文件 仅管理员可用 My code public static bool Edi
  • 使用 ADAL 对 Azure API 应用程序进行身份验证

    我有一个标记为 公共 已验证 的 Azure API 应用程序 并在关联的网关中设置了 Azure Active Directory 身份 详细信息请参阅保护 API 应用程序 然后 我在同一 Azure Active Directory
  • flutter 在小部件的多个实例之间共享状态

    在我的扑动应用程序中 我有一个ConnectivityStatus显示应用程序到我的树莓派的当前连接状态的小部件 在里面initState在我的小部件中 我订阅了一个计时器 每 5 秒检查一次连接并相应更新状态 然后在处理后取消订阅 问题是
  • Android Studio:com.android.ide.common.process.ProcessException:

    我正在尝试将 ArcGis 与 Android Studio 一起使用 我尝试按照以下步骤操作 https developers arcgis com android guide install and set up htm http bl
  • 刷新页面出现 404:仅在使用 /dist 文件夹时发生

    我有一个 LoopBackJS Restful 服务器运行在 localhost 3000 在前端 我有一个简单的 Angular 2 应用程序 它使用上述 API 当出现以下情况时 一切工作正常 使用nodemon运行服务器 根文件夹位于
  • 绘制熊猫时间增量

    我有一个 pandas 数据框 它有两个 datetime64 列和一个 timedelta64 列 这是两列之间的差异 我正在尝试绘制 timedelta 列的直方图以可视化两个事件之间的时间差 然而 仅仅使用df time delta
  • 如何增加Mapkit中userLocation注释的半径

    我的应用程序需要用户许可并将地图移动到该位置 默认情况下在该位置MapKit添加一个正在生成一些脉冲的蓝色图标 我到处搜索 但我发现如何添加一个 1000m 的圆圈userLocation 我不想要这样 你可以说我正在寻求定制userLoc
  • 帮助使用 int 的 TSQL IN 语句

    我正在尝试在存储过程中创建以下选择语句 dealerids nvarchar 256 SELECT FROM INVOICES as I WHERE convert nvarchar 20 I DealerID in dealerids I
  • 使用 GRPC 流请求进行代理负载平衡

    我们使用流式 RPC 将大文件发送到 GRPC 服务器 像这样 service FileReceiver rpc addData stream DataChunk returns Empty 在这种情况下是否可以使用代理负载均衡器 以便负载
  • 如何防止窗户被移动?

    我将如何阻止表格被移动 我将表单边框样式设置为 固定单一 并希望保持这种方式 因为它在 vista 中看起来不错 看看这个link 您可能对选项 3 感兴趣 它将要求您包装一些本机代码 但应该可以工作 链接底部还有一条评论 显示了一种更简单
  • 一次解析器中有多个匹配项?

    我正在尝试 还 用从日志解析的数据填充多个向量 关键是尽可能快速高效地完成 因此我想仅在一次传递中收集所有数据 而不是规则之间的 或 我发现了接下来的问题 1 每次我使用spirit 但它没有按预期工作时 我发现自己完全不知所措 并尝试了两
  • 在 Crystal Report 2008 中使用 .net 对象作为数据源

    HI all 我创建了一个 net 对象 例如 A 其中包含从表中收集的数据 接下来 我创建一个List a 并传递给SetDataSource 的方法ReportDocument目的 当我运行时 抛出了异常 CrystalDecision
  • MYSQL - 为表中的每个类别选择前 4 条记录

    我有一张桌子INVENTORY其中有其他列CATEGORY and UPDATED 按这些列对表进行排序很容易 SELECT FROM INVENTORY ORDER BY CATEGORY ASC UPDATED ASC 我想要的是获得一
  • Zend Framework - 并未显示所有错误

    在操作方法中 我有以下代码摘录 error reporting E ALL ini set display errors 1 Logger log test Logger类是这样定义的 class Logger public static
  • 为什么我的 git 推送到 HostGator 共享主机失败?

    我正在尝试将本地存储库部署到远程目录 我已经跑了git init bare在此远程目录中 并将正确的 ssh 路径添加到我的本地 git repo 分支 名为 dev git remote add server ssh email prot
  • 使用 SPARQL 获取图形路径[重复]

    这个问题在这里已经有答案了 我们有以下海龟数据集 表示我们想要观察某些属性的图表 prefix v1
  • 如何杀死Android应用程序启动的logcat进程?

    我有 Android 应用程序 在服务启动时实现以下代码 Process process Runtime getRuntime exec logcat v time s arg BufferedReader bufferedReader n
  • 我可以决定调用不存在的对象方法时会发生什么吗?

    我的代码如下所示 obj foo obj might or might not have a foo method 我想知道我是否可以覆盖发生的情况obj foo在我的代码中被调用 例如 obj foo function alert Hel