JavaScript 中有 8 种语言类型:
- 7 种基本类型:Undefined、Null、Boolean、Number、BigInt、String和Symbol
- 1 非原始类型:对象
原始类型的值称为原始值,它们不能具有属性。
所述的值对象非原始型被称为对象的它们可具有的特性。
当您尝试将命名的属性分配给'bar'
变量时foo
,如下所示:
foo.bar = 'abc';
那么结果将取决于 的值的类型foo
:
(a)如果 的值为Undefined或Nullfoo
类型,则会抛出错误,
(b)如果 的值为Objectfoo
类型,则将在对象上定义命名属性(如有必要),并将其值设置为,'bar'
foo
'abc'
(c)如果 的值foo
是任何其他类型,则 aTypeError
将在严格模式下抛出:“不能分配给属性"bar"
on foo
: not an object”。在松散模式下,上述赋值操作将是一个no op。在任何一种情况下,变量foo
都不会以任何方式改变。
因此,如您所见,只有当这些变量是对象时,才能为变量分配属性。如果不是这种情况,则赋值要么什么也不做,要么抛出错误。
在您的情况下,该变量test
包含String类型的值,因此:
test.test = "test inner";
什么都不做。
然而,由于 ES5 引入了访问器属性,所以我上面所说的有一个例外。访问器属性允许我们定义在检索或设置属性时调用的函数。
例如:
var str = '';
str.prop;
这str
是一个保存字符串值的变量。因此,访问该变量的属性应该是空操作(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/
但是,我不认为向内置原型添加访问器属性是一个好习惯。