2015-08-27 156 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 = “元”))'不使用属性;它使用赋值表达式的返回值。 –