JavaScript 中的反射

2024-01-18

我一直在研究 JavaScript 中反射的可能性。我已经有一个简单的反射器,它可以列出对象/函数的成员,如下所示:

window["Foo"] = {
    "Bar": {
        "Test": function () {
            this.x = 32;
            this._hello = "Hello World";
            this._item = 123.345;

            this.hello = function() {
                alert("hello");
            };

            this.goodbye = function() {
                alert("goodbye");
            }
        }
    }
}

$(document).ready(function () {
    var x = new Foo.Bar.Test();
    Reflect(new Foo.Bar.Test());
});

function Reflect(obj) {
    for (var item in obj) {
        $("body").append(item + "(" + typeof obj[item] + ") = " + obj[item] + "<br />");
    }
}

Results:

x(数字)= 32

_hello(字符串) = 你好世界

_item(数字) = 123.345

你好(函数)=函数(){警报(“你好”); }

再见(函数)=函数(){警报(“再见”); }

我的挑战的下一部分是构建一些可以反映(如果可能的话)对象名称以及对象路径的东西。

使用这个例子:...

var x = new Foo.Bar.Test();

我如何从 x 反射回“Test”?例如:

ReflectName(x); //returns "Test";

另外我怎样才能反射回 x 的路径?例如:

ReflectPath(x) //returns Foo.Bar.Test

使用 JavaScript 可以完成这两件事吗?我对此进行了研究,但到目前为止还没有提出任何可行的解决方案。

我不想要一个需要对对象/函数的名称和路径进行硬编码的解决方案,因为这会破坏使用反射的意义。


JavaScript 中没有类(尽管由于我不知道的原因模仿 Java 的代码风格,你可能会认为有一些类)。Foo.Bar.Test并不意味着阶级Test已在名称空间中注册Foo.Bar,但是被指定为属性的函数Test被指定为属性的某个对象Bar某些物体称为Foo.

你不能像“给我所有变量到哪个数字”那样进行反思7已分配”,因此您无法列出所有包含的对象Test在他们的属性之一。

这实际上很好,并开辟了新的可能性,但一开始可能会令人困惑。

顺便说一句,由于 JavaScript 中没有类,我相信术语反射并不是很幸运。和new Foo()并不意味着“创建 Foo 的新实例”,而是“创建一个新对象并执行函数Foo在该对象的上下文中,最后返回它。是的,那个new关键字非常令人困惑,如果你想在 JavaScript 中做任何更高级的事情,永远不要相信你的 Java/C# 经验。 JavaScript 模仿了 Java(我想不要吓到新手,让他们快速做简单的事情),但它有很大不同。

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

JavaScript 中的反射 的相关文章

随机推荐

  • 为什么即使对象指针在多重继承中不同,情况也是一样的?

    当使用多重继承时 C 必须维护多个 vtable 这导致对公共基类有 多个视图 这是一个代码片段 include stdafx h include
  • 具有非静态 lambda 成员的类不能使用默认模板参数吗?

    这个小测试程序 include
  • 通过 .htaccess 从 URL 中删除双斜杠或更多斜杠时出现问题

    我使用以下 htaccess 规则从 Web url 中删除双斜杠或多个斜杠 remove double more slashes in url RewriteCond REQUEST URI RewriteRule 1 2 R 301 L
  • 选定列的高图表不同颜色

    Highcharts 中不同的选定列是否可以有不同的颜色 这是我想做的事情的草图 http jsfiddle net jZmYW 4 http jsfiddle net jZmYW 4 选择一个点 列 时 它应该具有特定的颜色 我尝试通过为
  • XSLT 字符串替换

    我不太了解 XSL 但我需要修复这段代码 我已经减少了它以使其更简单 我收到这个错误 无效的 XSLT XPath 函数 在这条线上
  • Java MVC Web开发框架?

    我想用java开发一个网站 但我在java web开发方面是绝对的初学者 我想使用一个使用 MVC 模式和 Ajax 的框架 我做了一些搜索 发现 Spring 或 Struts 合适 但我不确定 您能推荐一个框架吗 游戏框架 http w
  • .NET - 从非托管数组复制到非托管数组

    我一直在查看 Marshal 类 但似乎找不到允许我从非托管数组 IntPtr 复制到另一个非托管数组 IntPtr 的方法 使用 NET 可以实现这一点吗 您还可以通过 DllImport RtlMoveMemory 来完成工作 DllI
  • 如何使用谷歌翻译应用程序

    我编写了有关字典句子的程序 我希望有功能可以在我的应用程序中转到 谷歌翻译 应用程序 我该如何使用它 我应该导入什么东西吗 据我所知 谷歌翻译 Android 应用程序没有公开任何标准Intent是你可以使用的 很遗憾 但同时也很奇怪 你会
  • Perl 意外行为:croak 与 try catch

    我看到一些异常指向 catch 块本身 参见下面的示例 在我看来 这是一个意想不到的行为 因为它改变了原始异常的位置并使得调试变得困难 应该说在第 13 行处死亡 如果我使用 die confess 或使用 eval 代替 try catc
  • FirebaseApp:Firebase API 初始化失败

    我遇到了由 Firebase Api 引起的错误 这是错误日志 Firebase API initialization failure java lang reflect InvocationTargetException Caused b
  • 哪个 C# 程序集包含 Invoke?

    另一个问题 为什么 VS10 如此热衷于抱怨 Invoke 在我不断追求让我的应用程序工作成为世界上最好的 C 程序员的过程中 我认为线程是一件好事 MSDN 有一篇关于制作的有用文章对控件的线程安全调用 http msdn microso
  • 传递对象时 Axios POST 请求不起作用

    我正在尝试使用 axios 在 vue js 应用程序中向本地 API 发出发布请求 并且响应返回空数据 使用 Postman 工具 API 上的 post 请求工作正常 下面是我的代码 var the data title This is
  • WebClient DownloadString 不返回任何内容

    我想从海盗湾的搜索查询中获取源代码 我的代码中有这个 但它不返回任何内容 WebClient webpage new WebClient string source webpage DownloadString http thepirate
  • FlatList 在添加新数据时重新渲染所有数据

    我测试了 FlatList 这是我想做的 1 使用componentDidmount获取10条初始数据2 向下滚动可获取另外 10 条数据 App js import React from react import View SafeAre
  • 如何防止 Typescript 查看父 node_modules 文件夹

    我在另一个 NPM 包中有一个 NPM 包 子包有一些代码 例如import range from iter tools 即使子 package json 没有依赖项iter tools I am NOT出现任何类型的 Typescript
  • 使用Visual Studio 2010开发nodejs

    是否可以使用VS2010开发NodeJS应用程序 我说的是普通的 Javascript 而不是 Azure 或任何类似的花哨的东西 我只是想使用 VS2010 作为 Javascript 编辑器 因为我有 NET 背景 而且我对它非常满意
  • 允许在数字字段中使用逗号

    这是一个非常愚蠢的问题 我觉得我一定错过了一些简单的事情 我有一个表格quantity场地 人们在输入数量时不断输入逗号 例如 他们输入12 000表示一万二千 所以我想在保存数量之前去掉逗号 12000在示例中 转换为数据库中的整数列 到
  • 提高 NumPy 数组上的操作性能

    我使用 numpy delete 从 while 循环内的数组中删除元素 仅当数组不为空时 此 while 循环才有效 这段代码工作正常但速度变慢 当数组有超过 1e6 个元素时 效果会显着提高 这是一个例子 while array sha
  • 共享自定义 NestJS 模块给出“不是当前处理模块的一部分”错误

    我们正在为不同的服务运行几个 NestJS 应用程序 它们都共享一些通用代码 在我们的例子中是 ConfigModule 和 CacheModule 我想将它们分解并放入公司 通用 npm 包中 以最大程度地减少代码复制 但我遇到了一个错误
  • JavaScript 中的反射

    我一直在研究 JavaScript 中反射的可能性 我已经有一个简单的反射器 它可以列出对象 函数的成员 如下所示 window Foo Bar Test function this x 32 this hello Hello World