2011-04-11 46 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