JavaScript:在原型中定义的方法中获取变量名称

时间:2011-11-27 20:39:17

标签: javascript prototype-programming variable-names

如何在方法中获取变量名,我在String()的原型中定义了?

String.prototype.foobar = function() {alert(/*something here...*/);};
var s="I'm just a stupid string!";
s.foobar();

应该返回包含“s”的警告......

我该如何管理?

问候。

修改

您可以在此处下载此主题的结果:https://github.com/ninov/onChange

4 个答案:

答案 0 :(得分:1)

“我想制作一种自定义事件,检查字符串是否更改”

那是不可能的。字符串是不可变的。

如果你想让函数提醒实际的变量名,那也是不可能的。如果您有String对象,则可以有几个引用同一对象的变量。它如何知道使用哪个名称?

您应该定义一个符合您需要的对象。最好带有制定者和吸气剂。

为了确保您收到引用该字符串的变量的更改通知,您可以这样做:

var str_obj = (function() {

    var s = "my string";

    return {
        getString: function() {
            return s;
        },
        setString: function( new_s ) {
            s = new_s;
            alert("s changed!");
        }
    };
})();

alert( str_obj.getString() ); // alerts "my string"

str_obj.setString( "new string" ); // alerts "s changed!"

alert( str_obj.getString() ); // alerts "new string"

答案 1 :(得分:0)

Javascript具有字符串原语(不是真正的javascript对象)和具有方法的字符串对象。我假设字符串基元更有效,并且像你一样静态声明的字符串将默认为基元。在大多数情况下,Javascript会在需要时自动将基元转换为对象。当我在Chrome中运行您的代码时,它会这样做,我会收到警报。

如果你想确定它是一个对象,你可以这样声明:

String.prototype.foobar = function() {alert("fun");};
var s = new String("I'm just a stupid string!");
s.foobar();

有关此主题的更多信息,请参阅“字符串基元和字符串对象之间的区别”here部分。

如果你要做的是从foobar()方法获取变量名,那么这不是Javascript以任何标准方式支持的东西。

如果这些都不是您实际要求的,请澄清您的问题。

答案 2 :(得分:0)

嗯,这确实有效。

如果您将该代码段更改为:

String.prototype.foobar = function() {alert(this);};

然后s.foobar();会提醒"I'm just a stupid string!"

如果这对您不起作用,请说明您正在测试的引擎。

我担心无法获取原始变量名称。

答案 3 :(得分:0)

这是不可能的。它不应该是。

如果你真的想知道这个元数据,你应该考虑使用一个对象:

var obj = {
   s: "I'm just a stupid string!"
};

for(var x in obj){
  alert(x + '=' + obj[x]); // logs: s=I'm just a stupid string!
}

但是你为什么要以编程方式知道变量名呢?