2011-11-27 63 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

相關問題