【发布时间】:2012-10-21 01:47:07
【问题描述】:
想象一个 JavaScript“类”Foo:
var Foo = function()
{
};
还有那个类的一个实例:
var foo = new Foo();
是否可以直接从实例foo获取字符串Foo,还是Foo只是实例化后无法与实例foo关联的传递变量?
编辑 1 SLaks suggests 使用 foo.constructor。这给出了:
function ()
{
}
如果函数以以下形式定义,则此方法有效:
function Foo()
{}
...但情况可能并非总是如此。
EDIT 2 尝试skizeey's approach 也不起作用。与 Slack 的方法相比,它本质上是一个更完整的尝试,但会产生一个空字符串:""
EDIT 3 我想知道这是否真的可行。请注意来自 Chrome 的 JavaScript 控制台的以下记录:
> var Foo = function() {}
undefined
> var foo = new Foo();
undefined
> foo
Foo
在最后一行中,Chrome 清楚地知道该对象的类型为Foo。然而,这可能只是 Chrome 的东西,而不是标准的 JavaScript,甚至无法从语言本身访问。
【问题讨论】:
-
你真的需要字符串
"Foo"吗?你最终想要做什么? -
我正在尝试在我的代码中利用约定。我正在使用 RequireJS 并且知道这个名称意味着我知道该类是在哪个模块中定义的,因此我可以在从本地存储重新饱和数据时再次加载它。
-
如果您控制所需模块中的构造函数,您可能只需要在其中写入名称。如果您不这样做,那么您是否希望将数据与其原始原型链重新关联?还是仅仅知道要加载哪些模块?
-
@user1689607,从某种意义上说。通过重新加载正确的模块,我将可以访问名称与模块匹配的类的实例。除非有人能找到方法,否则我什至必须将我自己的属性添加到每个符合这种模式的模块中,或者更改我声明构造函数的方式。
-
通常我建议对构造函数使用命名函数,如果没有别的,它有助于调试。您可以继续使用函数表达式,但使用命名表达式。
var Foo = function Foo() {...};虽然我更喜欢标准声明。function Foo(){...}
标签: javascript reflection prototype-programming