在prototype中定义的方法中获取变量名

JavaScript: Get variable name in method defined in prototype

本文关键字:获取 变量名 方法 定义 prototype      更新时间:2023-09-26

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

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

应该返回一个包含"s"的警告…

我该怎么做呢?

致意。编辑:

你可以在这里下载这个主题的结果:https://github.com/ninov/onChange

"我想创建一种自定义事件,它检查字符串是否更改"

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

如果您想让函数提醒实际的变量名,那也是不可能的。如果您有一个String对象,则可以有多个变量引用同一个对象。它怎么知道该用哪个名字呢?

你应该定义一个做你想做的事情的对象。最好使用setter和getter。

要确保您得到引用字符串的变量更改的通知,您可以这样做:

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"

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

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

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

有关此主题的更多信息,请参阅此处的"字符串原语和字符串对象的区别"一节。

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

如果这两个都不是你真正想问的,请澄清你的问题。

好吧,这是有效的。

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

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

s.foobar();将警告"I'm just a stupid string!"

恐怕没有办法得到原来的变量名

这不可能。也不应该是这样。

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

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!
}

但是为什么要通过编程的方式知道变量名呢?