JavaScript中有8种语言类型:
- 7 种原始类型:不明确的, Null, Boolean, Number, BigInt, String, and Symbol
- 1 非原始类型:Object
原始类型的值称为原始值,它们不能具有属性。
的价值观Object非原始类型称为对象,它们可以具有属性。
当您尝试分配名为的属性时'bar'
到一个变量foo
,像这样:
foo.bar = 'abc';
那么结果将取决于值的类型foo
:
(a)如果值foo
属于类型不明确的 or Null,那么就会抛出错误,
(b)如果值foo
属于类型Object,然后是一个命名属性'bar'
将在对象上定义foo
(如果需要),其值将设置为'abc'
,
(c)如果值foo
是任何其他类型,那么TypeError
将在严格模式下抛出:“无法分配给财产"bar"
on foo
:不是一个物体”。在松散模式下,上面的赋值操作将是no op http://en.wikipedia.org/wiki/NOP。无论哪种情况,变量foo
不会以任何方式改变。
因此,正如您所看到的,只有当变量是对象时,为变量分配属性才有意义。如果情况并非如此,那么赋值要么根本不执行任何操作,甚至抛出错误。
在你的情况下,变量test
包含类型的值String, 所以这:
test.test = "test inner";
什么也不做。
然而,由于 ES5 引入了访问器属性,所以我上面所说的有一个例外。访问器属性允许我们定义每当检索或设置属性时调用的函数。
例如:
var str = '';
str.prop;
Here str
是一个变量,持有String价值。因此,访问该变量的属性应该是无操作(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/ http://jsfiddle.net/fmNgu/
但是,我不认为向内置原型添加访问器属性是一个好的做法。