Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:在prototype中定义的方法中获取变量名_Javascript_Prototype Programming_Variable Names - Fatal编程技术网

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

JavaScript:在prototype中定义的方法中获取变量名,javascript,prototype-programming,variable-names,Javascript,Prototype Programming,Variable Names,如何在我在String()原型中定义的方法中获取变量名 应返回包含“s”的警报 我该怎么办 问候 编辑: 您可以在此处下载本主题的结果:Javascript具有字符串原语(不是真正的Javascript对象)和具有方法的字符串对象。我假设字符串原语更有效,并且像您这样静态声明的字符串将默认为原语。在大多数情况下,Javascript会在需要时自动将原语转换为对象。当我在Chrome中运行你的代码时,它会这样做,我会收到一个警报 如果要确保它是一个对象,可以这样声明: String.prototy

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

应返回包含“s”的警报

我该怎么办

问候

编辑:


您可以在此处下载本主题的结果:

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()
会提醒
“我只是一个愚蠢的字符串!”

如果这不适用于您,请告知您正在测试的发动机


恐怕无法获取原始变量名。

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

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

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!
}
但是为什么您想通过编程知道变量名呢?

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

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

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

你应该定义一个你想要的对象。最好是二传手和接球手

要确保收到引用字符串的变量更改的通知,可以执行以下操作:

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"

这不是OP要求的。这是关于变量名,而不是值的问题。虽然警报可以与
this
配合使用,但值得注意的是
this
是一个
字符串
对象,而不是一个原始字符串。@pimvdb但是我如何获得字符串对象的名称呢?如果你的意思是
“s”
那么我想你运气不好,因为变量名没有传递。让我们假设它是一个字符串对象。。。我该怎么做?(s=new String();)@ninov-我不明白你的问题<代码>var s=新字符串(“aaa”)工作正常。你还想问什么?我想做一种自定义事件,它检查字符串是否改变nd:s.onchange(function(){alert(“s change!”);});onchange方法应该启动一个间隔,检查变量s是否每10ms改变一次。@ninov:这是一个非常值得怀疑的实现方法。我强烈建议您使用更具体的数据结构来实现这一点。如果要调解或检测对象的更改,请封装数据并提供访问器方法来检索或更改值(例如,
setValue(){/*…*/}
)。使用这种方法,您不必想出任何黑客来检测更改——只要在调用
setValue()
时触发一些事件函数即可。是的,这是一种更好的方法。
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"