2015-08-27 44 views
1

我經常使用的功能元的屬性,即像這樣添加自定義屬性字符串

var func = function(){} 
func.meta = "meta"; 
console.log(func);//output: function func() 
console.log(func.meta);//output: "meta" 

但是,當我試圖在類似的方式使用字符串,這我以前不工作。

var string = "string"; 
string.meta = "meta"; 
console.log(string);//output: "string" 
console.log(string.meta);//output: undefined 

爲什麼以及如何解決這個問題?

回答

3

你的字符串是一個原始值。它接受了財產,因爲有些魔法會暫時將它轉換爲對象(或者你可以這樣想)。所以這個任務在那之後是沒用的。

您可以使用new String構造函數來創建一個實際可以保持的對象,但這對於JavaScript非常不尋常。

var string = new String("string"); 
string.meta = "meta"; 
console.log(string); 
console.log(string.meta);//output: "meta" 

string本身控制檯輸出實際上可能不會給你想要的東西,但在實踐中應串聯工作本身。

請記住,typeof將不會再爲您提供"string"。現在將是"object"

就個人而言,我只是創建一個自定義的構造函數,如果你需要存儲比字符串本身更多,然後與該物體是由您的字符串和元數據的知識,使用它。

+0

@zeroflagL:你有沒有完成到句子結尾?無論如何,這是思考JS中原語的財產訪問的有用方式。即使規範也無法告訴你具體的實現是什麼。 –

+0

讓我改一下我的發言:在ECMAScript中5實際上可能會創建一個對象,但_「的實現可能會選擇避免實際的創造,瞬態對象」 _。至於ECMAScript 2015,我同意你評論的最後一個陳述。 BTW:已創建的屬性實際上可以使用:'的console.log((string.meta = 「元」))'將記錄 「元」。 – zeroflagL

+0

@zeroflagL:只是提醒一下,這是一個社區wiki。如果您認爲合適,非常歡迎您對其進行改進。 :-)然而,'的console.log((string.meta = 「元」))'不使用屬性;它使用賦值表達式的返回值。 –