动态 getter 和 setter - 一种可能性

2024-05-26

我正在尝试解决最近出现的一个问题。 假设我们想要并且知道如何在 javascript 中使用动态 getter 和 setter,就像 php 中的那样 (__get, __set)。但由于 javascript 没有包罗万象的属性,我们唯一能做的就是提供可能的键列表,并迭代仅在这些键上添加 getter 和 setter,并希望不会出现其他键。

但问题到目前为止还没有解决。所以我想到的下一个方法是使用一个令人讨厌的黑客try and catch,因此任何时候在对象中未定义名称时都可以使用catch作为一个吸气剂(至少),然后恢复代码,这是一件困难而且可能毫无意义的事情。但从这里开始我的第二个问题,在这样的使用中:

console.log(g.someundefinedproperty); 

结果会是一个电话console.log显示undefined无一例外地被抛出。 然后我想到:如果我使用原来的呢?window.undefinedgetter 和 setter,毕竟每次我搞砸并拼错单词或其他东西时都必须调用它。

所以我尝试了

Object.defineProperty(window, 'undefined', {
    get : function ()
    {
         // functional code, including getting the caller and figuring out
         // where we are, and what we have to do... easy :D

         console.log('works');
    },
    set : function ()
    {
         // some couple more fine hacks here
         console.log('this too');
    }
});

但不幸的是undefined窗口的属性是configurable : false。 其他尝试过的黑客行为是克隆window对象除了undefined和内在window财产。并在新对象上定义新的undefined(请注意讽刺)然后window = mybetterwindow;

由于这没有引起任何问题,我的希望很高,但系统再次让我失望window根据设计,不能被覆盖。 我猜测它有自己的吸气剂,并且它根据中找到的原型重新实例化自己window.prototype甚至更好Window.prototype(注意大写)。

作为这个实验的最后一步,我重新定义了undefined在这个原型上运行。无济于事,没有任何改变......我尝试创建一个new Window(), but Window不是构造函数,失败!

由于我已经没有想法了,所以我发现自己正在写这篇寻求帮助的文章。 如果您对如何解决动态 getter 和 setter 问题有任何想法,(the existencial problem of life, universe and everything else),以一种不会以任何方式修改...我使用对象的方式(并且作为奖励,它不会need to break a hole in the fabric of time and space)或语法,我恳求你说话,否则永远保持沉默:)。


但不幸的是 window 的未定义属性是configurable: false

这仅是因为EcmaScript 5.1 http://es5.github.com/#x15.1.1.3。以前,它是可重写的。

如果我使用原来的怎么办window.undefinedgetter 和 setter,毕竟每次我搞砸并拼错单词或其他东西时都必须调用它。

不,这是行不通的。两者之间存在差异不明确的 value http://es5.github.com/#x8.1和全局变量“未定义”。该变量不会在每次执行时进行评估不明确的遇到值(例如在typeof (void 0)),仅当您明确使用它时(例如在g.someprop === undefined).

有什么想法可以解决动态 getter 和 setter 问题吗?

解决办法只有一种:Proxies http://wiki.ecmascript.org/doku.php?id=harmony:proxies。不幸的是,这只是一个和声草案,目前仅Firefox Javascript 1.8.5 支持 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Proxy.

也可以看看是否有与属性的 __noSuchMethod__ 功能等效的功能,或者在 JS 中实现它的方法? https://stackoverflow.com/questions/2266789/is-there-an-equivalent-of-the-nosuchmethod-feature-for-properties-or-a-way/3757676#3757676, 检测何时将新属性添加到 Javascript 对象? https://stackoverflow.com/q/2775384/1048572 or 如何检测属性何时添加到 JavaScript 对象? https://stackoverflow.com/q/12678517/1048572它实现了轮询解决方案(通过检查更改setInterval).

对于一个干净的解决方案,您当前必须使用显式 getter 函数,您可以传递属性名称(g.get("someundefinedproperty")).

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

动态 getter 和 setter - 一种可能性 的相关文章

随机推荐

  • 2 个单词之间有空格 CSS

    我想在 css 中的 2 个单词之间添加一个空格 例如 1 RUNNING DAYS email protected cdn cgi l email protection 在 HTML 中有 nbsp nbsp但使用不正确 nbsp我认为
  • 使用网络计算机进行 Matlab 并行处理

    我熟悉matlabpool and parfor用法 但我仍然需要加快计算速度 我的 1GB 网络中有一台功能更强大的计算机 两台计算机都有 R2010b 并且具有相同的代码和路径 使用两台计算机进行并行计算的最简单方法是什么 我今天使用的
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 在 Tomcat 中触发内部 ServletRequest

    我正在使用 Quartz 来安排 Web 应用程序的后台任务 其中一些任务只是针对同一 Web 应用程序发出请求 我想避免依赖于任何类型的网络设置 例如 如果从数据中心内发出带有我自己域名的请求 则可能无法正确路由 是否有一个 Java A
  • Android 浏览器缩放?

    我正在尝试为 Android 创建一个移动网站 当我将主体宽度设置为 480px 屏幕宽度 时 结果比我预期的大 50 左右 看来 android 正在缩放它所绘制的内容并弄乱了我所有的布局 有谁知道如何禁用它或解决它 我已经在使用这个 您
  • 没有数据库的 django 单元测试

    是否有可能在不设置数据库的情况下编写 django 单元测试 我想测试不需要数据库设置的业务逻辑 虽然设置数据库很快 但在某些情况下我真的不需要它 您可以子类化 DjangoTestSuiteRunner 并重写 setup databas
  • 在 PHP 扩展中,推荐从 std::string 返回值的方法

    我们有一个简单的 PHP 函数 其目的是调用 C 自由函数std string callLibrary std string 并返回其std string返回值 目前看起来是这样的 PHP FUNCTION call library cha
  • 如何让BackgroundWorker返回一个对象

    我需要做RunWorkerAsync 返回一个List
  • Python 的最佳实践:assert command() == False [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • innerHTML 未写入 svg 组 Firefox 和 IE

    我正在做一个项目 遇到了障碍 在 Chrome 中 它按预期工作 但在 Firefox 和 IE 中则不然 下面的代码实际上只是真实项目代码的非常简化的版本 基本上我正在尝试替换 svg 的每组中的圆圈 因此 我从预编码的圆圈开始 然后删除
  • FROM 子句中子查询末尾随机字母的含义 - SQL

    我终于成功将两个sql sum查询的结果求和了 这家伙迈出了一小步 我的问题与代码中的最后一个字符 Z 有关 SELECT SUM hr FROM SELECT SUM amount AS hr FROM Try again dbo tue
  • 仅底部的框阴影

    我有一盒内容 需要为其提供阴影 但我只想为盒子的底部提供阴影 我用过这个css box shadow 0 3px 5px 000000 如果我给出这个代码 它会显示左 右和底部 我只需要底部 任何人都可以建议解决这个问题吗 多谢 添加类后您
  • Oracle SQL 查询日期格式

    我总是对 ORACLE SQL 查询中的日期格式感到困惑 并花几分钟时间去谷歌 有人可以向我解释当数据库表中有不同格式的日期时解决问题的最简单方法吗 例如 我有一个日期列为 ES DATE 保存的数据为 27 APR 12 11 52 48
  • 如何在 sed 中用“pwd”的结果替换令牌?

    我正在尝试做这样的事情 sed s REPLACE WITH PATH pwd 不幸的是 我出错了 sed e expression 1 char 23 unknown option to s 为什么会发生这种情况 您需要使用不同的字符而不
  • 在 Swift 中删除字符串中第一个字符的最简洁方法是什么?

    我想删除字符串中的第一个字符 到目前为止 我想到的最简洁的事情是 display text display text substringFromIndex advance display text startIndex 1 我知道我们不能用
  • .NET:EventHandler 竞争条件修复如何工作?

    以下模式用于在引发事件时避免竞争条件 以防另一个线程取消订阅 MyEvent 使其为空 class MyClass public event EventHandler MyEvent public void F EventHandler h
  • cmd:找不到服务:活动#Error:ADB 在 flutter 中退出,退出代码为 1

    更新 android studio 后 我运行我的 flutter 程序 错误表明 Launching lib main dart on AOSP on IA Emulator in debug mode Running Gradle ta
  • BigVideo.js 播放结束时 URL 重定向

    我已经使用基于 Video js 的 BigVideo 在页面上实现了背景视频 单击 div 时 视频会在后台播放 我一生都无法弄清楚如何在视频播放完毕后重定向到另一个 URL 这是我正在使用的代码 视频播放链接 a href vids g
  • 动态 getter 和 setter - 一种可能性

    我正在尝试解决最近出现的一个问题 假设我们想要并且知道如何在 javascript 中使用动态 getter 和 setter 就像 php 中的那样 get set 但由于 javascript 没有包罗万象的属性 我们唯一能做的就是提供