2011-04-11 29 views
2

我弄不明白爲什麼foo.bar在這個例子中是undefined,你能解釋一下嗎?關於Javascript屬性和實例的問題

var foo = "foo"; 

foo.bar = "baz"; 
console.log(foo.bar); // undefined 

Q2:如何添加到String實例foo屬性和方法的引用?

幫助表示讚賞,謝謝。

- 編輯 -

注:問題是關於一個通用的字符串例如,而不是String global object。因此,使用「經典」原型建議不是一種選擇,因爲這樣每個String實例都會有一個名爲bar的屬性,而我只想增加某些實例

+1

的可能重複(http://stackoverflow.com/questions/5201138/why-cant-i-add-properties-to-a-string-object-in-javascript) – Quentin 2011-04-11 18:20:59

回答

1

當你指定var foo =「foo」;你要求foo被解釋爲一個字符串。字符串只能有一個字面值作爲值。它不能有任何其他的子屬性。 (只要將這個邏輯延伸到你知道的任何其他編程語言,它就會變得更清晰)。相反,你可以做這樣的事情。

var fooObject = new Object() 
fooObject.foo = "foo" 
fooObject.bar = "baz" 
2

foo.bar = "baz";相同undefined = "baz";

您可以使用它的原型添加功能串;

String.prototype.bar = function() { 
    return "baz"; 
}; 

foo.bar() ; //# => baz 
0

要擴展String類,修改它的原型:

String.prototype.bar = "baz"; 
var foo = "foo"; 
console.log(foo); // "foo" 
console.log(foo.bar); // "baz" 

在你的問題,你修改String類的一個實例而不是String類本身。

2

通過使用一個真正的String對象爲foo:爲什麼我不能添加的屬性在JavaScript字符串對象]

var foo = new String('foo'); 
foo.bar = 'baz'; 
console.log(foo.bar); // 'baz' 
+0

+1在犀牛中測試過它,它工作正常。雖然''s'===新的String('s')'由於它們有不同的類型而評估爲false。我可以想象造成錯誤的事情。 – Dunes 2011-04-11 21:49:16

+0

不知道錯誤,我想如果使用不當,可能會導致錯誤。但是,嘿,那是所有的代碼,不是嗎?無論如何,這都是可行的,但我必須說,我從來沒有發現這種字符串擴展的用途。 – KooiInc 2011-04-12 05:12:24