是否有可能创建一种更具活力的新类型?

2024-01-06

可能不是正确的词。但我想用 JavaScript 创建一个新类型。它具有一个简单的属性,可以做到这一点:

var inst = new SomeType();
inst.key1.key2 = 'something';
inst.key1.key1.key3 = 'something';

基本上,您不必声明对象文字即可进一步扩展。它会自动创建一个。

这将使我能够构建复杂的结构,而不必担心检查是否存在要扩展的属性。

而不是做

inst.key1 = {};

inst.key1.key2 = 'data';

一个人可以做

inst.key1.key2 = 'data';

and the

inst.key1 = {};

将是自动的,即会在内部发生。

这确实有一个实际目的。特别是我有一个注册表模式,我将使用这种新类型来使用更加分层的方法来组织数据。

另外,我看到一种在库中常见的模式,它测试对象文字是否存在,然后在不存在时创建一个。

这似乎是一个常见的习语。


您想要得到的东西可以轻松实现和谐代理 http://wiki.ecmascript.org/doku.php?id=harmony%3aproxies (MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). However,这个 API 还不稳定,所以可以在非关键爱好代码中使用它,但不要在生产代码中使用它(还)。

这是一个非常简单的例子:

function getFreeChain(object) {
    var handler = {
        get: function(target, name) {
            if (name in target)
                return target[name];
            var newTarget = target[name] = {};
            return new Proxy(newTarget, handler);
        }
    };
    return new Proxy(object, handler);
}

// Usage:
var obj = {};
var magicalObj = getFreeChain(obj);
magicalObj.a.b.c.d.e.g = 1;
console.log(magicalObj.a.b.c.d.e.g); // 1
console.log(obj.a.b.c.d.e.g);        // 1
obj.x.y.z = 1;                       // TypeError: obj.x is undefined

注意:我的例子是最新的实现Proxy规范,仅 Firefox 支持。 Chrome 仅支持旧的、显着不同的 API 版本 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Old_Proxy_API,可以通过打开“实验性 JavaScript”来启用chrome://flags/。这个旧的 API 很丑陋,实现以前的 API 需要更多的代码行,所以我将把它作为练习留给读者。

哦,有一个图书馆叫DirectProxies.js https://code.google.com/p/es-lab/source/browse/trunk/src/proxies/DirectProxies.js(取代和谐反映 https://github.com/tvcutsem/harmony-reflect)这为 Chrome 带来了简单的代理 API。包含该库后,之前的代码将在 Firefox 和 Chrome 中运行(启用实验):http://jsfiddle.net/PAhYL/ http://jsfiddle.net/PAhYL/

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

是否有可能创建一种更具活力的新类型? 的相关文章

随机推荐

  • LTE堆栈协议开发

    在阅读一篇有关 LTE 的文章时 我遇到了一个术语 LTE 堆栈协议开发 遗憾的是 没有关于这个术语的进一步解释 当我在谷歌上查找时 它发现了 LTE 协议开发的所有职位空缺 所以问题是 LTE 堆栈协议开发 到底是什么 如果可能的话 我想
  • 欧拉计划 3 - 为什么这个方法有效?

    13195 的质因数是 5 7 13 和 29 数字 600851475143 的最大质因数是多少 我用自己的方式在Project Euler上解决了这个问题 速度很慢 然后我在某人的github帐户上找到了这个解决方案 我不明白为什么它有
  • 所有级别的日志中每个用户/会话都有唯一的 ID? Log4J?

    我们正在进行一些性能测试 以确定应用程序的哪些步骤需要多少时间 当然 使用正则表达式轻松解析 过滤日志是一个魅力 针对问题 我们的jsf应用程序被分成几个项目 这些项目被其他 非jsf 应用程序使用 我的第一个方法是 if logger i
  • VBA 中 Range() 的 .Value 属性

    我见过的一些 Excel VBA 代码没有使用 Range 对象上的 Value 属性 例如 myX Range A1 而不是 myX Range A1 Value 这仅仅是因为范围对象的默认行为是返回单元格中的值吗 是否有一个时候我会no
  • UITableView 普通样式部分标题在搜索视图上重绘

    当 tableView 位于搜索栏显示控制器的后台时 有人成功地重新加载了 tableView 吗 看照片看看发生了什么 我有一个带有搜索显示控制器的 UITableViewController 当我在显示搜索显示控制器的表视图时对 UIT
  • LINQ 中的日期范围重叠问题

    表中给定特定记录的日期范围 例如特定字段 名称 如果有人试图在之前的日期范围内插入该名称 则不应允许这样做 我在这里尝试过一些代码看看这个 if dataContext TableAs Where x gt x EndDate gt Sta
  • Perl 版本特定语法资源

    网络上是否有资源可供我查找 perl 版本 5 8 1 与 current stable 特定语言语法 而无需转到 perldoc 并在版本之间切换 然后搜索我正在寻找的语言项目看看它是否存在于所选版本中 这似乎是一种蹩脚的方式 我想我应该
  • 数据绑定中的双重间接。在模板中插入字符串

    我正在尝试解决指令链接函数中的双重绑定 scope a surprise scope b a 模板是 div b div 它呈现为 div a div 是否可以让视图显示 div surprise div 我一直在尝试重新编译该指令 但是有
  • Python 中通过 USB 转换器进行串行通信 - 如何解决这个问题?

    python 程序需要每秒从串行端口接受一个字符串 我计划使用 RS 232 转 USB 转换器 该应用程序将在 Ubuntu 10 04 下运行 我该如何处理这个问题 我用吗pySerial http pyserial sourcefor
  • @ 字符未显示在 Watson Conversation Service 响应字符串中

    在使用 IBM Watson Conversation Service WCS 时 我想在响应中打印电子邮件地址 问题在于 WCS 忽略了 符号之后的所有字符以及 字符本身 我尝试使用 and 逃避它 但并没有多大帮助 如何在响应字符串中打
  • 测试驱动开发适合初学者吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 以编程方式更改列表框项目背景颜色

    我很难理解 XAML 如何与 C 结合使用 我的问题是 我有两个不同的List
  • Grails 2.1.0 应用程序 tomcat 7.0.22 重定向后会话为空

    我刚刚学习 grails 并且遇到了一个应用程序问题 该应用程序在 Netbeans 中运行时工作正常 但在部署到 Centos 5 4 服务器上的 Tomcat 7 0 22 时却显示出奇怪的行为 我正在使用 proxy ajp 使该应用
  • Ziparchive 无法仅在 PHP 中打开 zip 文件

    我正在尝试使用 PHP 解压缩文件压缩存档 http php net manual en class ziparchive php类但是当我尝试时 file path to zip file zip zip new ZipArchive r
  • React/ ESLint - JSX props 不应使用箭头函数

    我目前正在 React 中创建一个组件 并且正在使用 ES Lint 规则react jsx no bind 我的问题是我希望能够将参数传递给我的组件函数 这是我想用来执行此操作的代码 class LanguageDropdown exte
  • 如何用plotly绘制椭球体

    有什么方法可以用plotly 3D 绘制类似椭球体的表面吗 目前只有表格的表面z f x y 在文档中进行了讨论 还有Mesh 3D https plot ly python reference mesh3d 但我没有找到相关的例子 似乎可
  • 从 Android 联系人中获取单个电话号码

    您好 我正在尝试从联系人列表中获取一个电话号码 我找到了可以获取整个联系人列表电话号码的代码 我想要的只是所单击项目的电话号码 任何帮助将不胜感激 谢谢 public void onClick View v Intent contactPi
  • 如何使用 IntelliJ IDEA 应用“移动方法”重构?

    我希望能够在 IntelliJ IDEA 中将实例方法从一个类移动到另一个类 Fowler 的 重构 中的 移动方法 不幸的是 当我尝试 移动 cmd F6 时 它告诉我 没有具有引用类型的方法 您想让方法静态然后移动吗 我不想使我的方法成
  • hijri(伊斯兰)日历问题!

    我会将公历日期转换为回历 伊斯兰 日期 经过网上搜索 找到了转换的源代码 我将代码从 Java 和 PHP 转换为 C 语言 该工具有时工作时没有任何问题 但有些日子有问题 我需要您的帮助 要么修复该工具 要么提供可以正常工作的可用代码 顺
  • 是否有可能创建一种更具活力的新类型?

    可能不是正确的词 但我想用 JavaScript 创建一个新类型 它具有一个简单的属性 可以做到这一点 var inst new SomeType inst key1 key2 something inst key1 key1 key3 s