Object
除了5种原始类型外,一切都是Object,包括Object、Function、Array等等,他们的实例和构造器,都是Object。那 Object是一个什么东西呢?
Object是一个:无序的成员集合
它是一个集合,说明它包含0-n个成员。而它是无序的。
每一个成员由以下3个部分组成:名称、值、特征集合
下面的代码中:
var obj = { 'key' : 'value' };
key就是成员名称,value就是值,obj这个Object从代码上看起来包含了一个成员,注意,是从代码上看而已。这里我们不去深究它先。
那特征集合是个什么东西呢?
javascript的对象成员可能包含下面几种特征的0个或多个:ReadOnly、DontEnum、DontDelete、 Internal。
- ReadOnly:拥有这个特征的成员是不能被程序修改的。
- DontEnum:拥有这个特征的成员是不能被for in遍历的。
- DontDelete:拥有这个特征的成员是不能被delete操作删除的。
- Internal:代表这个成员是内部成员。通常内部成员不能被程序以任何方式访问,但是有些javascript的引擎实现将它以特殊方式暴露,使得可以访问对象的某些内部成员。
一个对象的Internal成员以[[xxxx]]的方式来表示。
下面列一些和本博有关的的Object可能包含的internal成员。
- [[Class]]:表示该对象的类型。比如function Object的[[Class]]成员的值是"Function"
- [[Get]](PropertyName):获取对象的属性值。
- [[DefaultValue]] (Hint):用于ToPrimitive进行类型转换时调用。hint参数可能的值为"string"或"number"
- [[Prototype]]:[[Prototype]]成员实现了javascript中所谓的“原型链”。一个对象的[[Prototype]]成员可能是object对象,或者是null。只有Object.[[prototype]]为null,其他任何对象的[[Prototype]]成员都是一个Object
- [[Call]]:function Object特有的成员,在函数被调用的时候,就是调用的[[Call]]。
- [[Construct]]:function Object特有的成员,在函数作为构造器,被new操作符用于创建对象的时候,就是调用的[[Construct]]。
- [[Scope]]:[[Prototype]]成员实现了javascript中所谓的“作用域链”。
------------------- 切割线 ----------------------