2011-11-27 68 views

回答

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支持的任何标准方式。

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

+0

让我们假设它是一个String对象......我怎样才能做到这一点? (__s = new String(); __) – ninov

+0

@ninov - 我不明白你的问题。 'var s = new String(“aaa”);'工作得很好。你还问什么? – jfriend00

0

嗯,这实际上有效。

如果更改代码段:

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

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

如果不适合你,请告诉哪个引擎你正在测试。

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

+0

这不是OP要求的。它是关于变量名称的,而不是值 – Harmen

+0

虽然alerting可以在'this'下正常工作,但值得注意的是'this'是一个String对象,而不是原始字符串。 – pimvdb

+0

@pimvdb但我怎样才能得到字符串对象的名称? – ninov

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

但是你为什么要编程知道变量名?

+0

我想做一种自定义事件,它检查是否字符串转换:s.onchange(function(){alert(“s changed!”);});并且onchange方法应该启动一个时间间隔来检查变量是否每10ms更改一次...... – ninov

+0

@ninov:这是一个非常可取的方法。我强烈建议你使用更具体的数据结构来做到这一点。如果要调解或检测对对象的更改,请封装数据并提供访问器方法以检索或更改该值(例如'setValue(){/ * ... * /}')。通过这种方法,您不必为了检测更改而想出任何窍门 - 只要调用setValue(),只需激发一些事件函数即可。 – bobbymcr

1

“我要让一种自定义事件,检查如果字符串变化了的”

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

如果你想让函数提醒实际的变量名称,那也是不可能的。如果你有一个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" 
+0

是的,这是一个*更好的方法。 – bobbymcr

相关问题