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