为什么我不能将属性添加到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: String , Number , Boolean , Null , Undefined
- 1个非原始types: Object
原始types的值称为原始值,不能有属性。
对象非基元types的值称为对象,它们可以具有属性。
当您尝试将名为'bar'
的属性分配给variablesfoo
,如下所示:
foo.bar = 'abc';
那么结果将取决于foo
的值的types:
(a)如果foo
的值的types是Undefined或Null ,则会抛出一个错误,
(b)如果foo
的值是Objecttypes,那么将在对象foo
上定义一个命名的属性'bar'
(如果需要的话),其值将被设置为'abc'
(c)如果foo
的值的types是Number , String或者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"