为什么我不能将属性添加到JavaScript中的string对象?

我inheritance了另一个开发人员写的一些JavaScript代码。 他不喜欢我们在整个项目中使用的网格组件,所以他决定自己写。 他写的网格不能sortingdate,因为它只能绑定到string/数字。 他在使用它们之前将所有date转换为string。 我看了他编写的date函​​数的string格式,并认为我可以添加date属性到原始值的string,然后在sorting时,看看string是否有一个date属性和sorting的基础上。 但是,似乎你不能在JavaScript中添加string的属性。 我不知道有一些你不能添加属性的types。 例如:

<html> <script> var test = "test"; test.test = "test inner"; console.log(test); console.log(test.test); </script> 

test.test将是未定义的。 奇怪的。 我的问题是为什么这个代码不起作用? 而且,如果你可以想到在该网格上sortingdate的任何解决方法(除了实际绑定date对象而不是string,这将是一个痛苦的解决),这将是非常有帮助的。

JavaScript中有6种语言types:

  • 5种基本types: StringNumberBooleanNullUndefined
  • 1个非原始types: Object

原始types的值称为原始值,不能有属性。
对象非基元types的值称为对象,它们可以具有属性。

当您尝试将名为'bar'的属性分配给variablesfoo ,如下所示:

 foo.bar = 'abc'; 

那么结果将取决于foo的值的types:

(a)如果foo的值的types是UndefinedNull ,则会抛出一个错误,

(b)如果foo的值是Objecttypes,那么将在对象foo上定义一个命名的属性'bar' (如果需要的话),其值将被设置为'abc'

(c)如果foo的值的types是NumberString或者Boolean ,那么variablesfoo不会以任何方式改变。 在这种情况下,上面的分配操作将是一个noop 。

所以,正如你所看到的,如果这些variables是对象的话,赋值给variables也是有意义的。 如果情况并非如此,那么这个任务就不会做任何事情,甚至会抛出一个错误。


在你的情况下,variablestest包含一个Stringtypes的值,所以这个:

 test.test = "test inner"; 

什么都不做。


但是,由于ES5引入了访问器属性,所以我上面说过了一个例外。 访问器属性允许我们定义在检索或设置属性时调用的函数。

例如:

 var str = ''; str.prop; 

这里str是一个持有String值的variables。 因此,访问该variables的属性应该是一个无操作( str.prop只是返回undefined )。 这是一个例外:如果String.prototype包含访问器属性'prop'和定义的getter,那么getter将被调用。

所以,如果这是定义:

 Object.defineProperty( String.prototype, 'prop', { get: function () { // this function is the getter } }); 

那么这个

 str.prop; 

将调用getter函数。

现场演示: http : //jsfiddle.net/fmNgu/

但是,我不认为给内置的原型添加访问器属性是一个好的做法。

如果你使用一个String对象,你可以添加属性:

 var test = new String("test"); test.test = "test inner"; console.log(test.toString()); // prints out "test" console.log(test.test); // prints out "test inner"