ITPub博客

首页 > Linux操作系统 > Linux操作系统 > javascript Object分析

javascript Object分析

原创 Linux操作系统 作者:ForTechnology 时间:2011-08-05 17:27:09 0 删除 编辑
javascript. Object分析[问题点数:40分,结帖人:baibaidudu]
•    
•    baibaidudu
•    (baibaidudu)
•    
•    等 级:  
•    结帖率:60.00%•        楼主发表于:2010-06-09 20:54:55
接着前面的javascript. 的数据类型分析说下object的分析:
 Object
除了5种原始类型外,一切都是Object,包括Object、Function、Array等等,他们的实例和构造器,都是Object。那Object是一个什么东西呢?  
Object是一个:无序的成员集合  
它是一个集合,说明它包含0-n个成员。而它是无序的。  
每一个成员由以下3个部分组成:名称、值、特征集合  
下面的代码中:  
var bj = {'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中所谓的“作用域链”。  
5. function Object的创建过程
解析器在遇到function declaration或者function expression的时候,会创建一个function Object。步骤大致如下:  
1. 解析形参和函数体  
2. 创建一个native ECMAScript. Object:F  
3. 设置F的[[Class]]、[[Prototype]]、[[Call]]、[[Construct]]、[[Scope]]、length属性  
4. 创建一个new Object():O  
5. 设置O的constructor属性为F  
6. 设置F的prototype属性为O  
在这个创建过程里,要说明的几点是:  
1. 步骤3中F的[[Prototype]]被设置为Function.prototype  
2. 用户自定义的function,都会同时具有[[Call]]和[[Construct]]这两个internal属性  
3. 解析器会自动给每一个function Object初 始化一个prototype成员。而F.prototype.constructor == F,所以,当我们没有重新定义这个F的prototype成员的时候,F的实例的constructor成员是靠谱的。因为(new F).constructor其实方位的是F.prototype.constructor,而解析器默认初始化给你的 F.prototype.constructor就是F。  
4. 关于[[scope]]和作用域链的问题,下文分解  
还要提的一点是,function declaration和function expression是不一样的  
function declaration:  
function fn() {}  
function expression:  
var a = function () {};  
function () {};  
6. 原型链
首 先要澄清的一点是,我们通常会使用myfunction.prototype的方式进行原型扩展,所以我们在听到“原型链”这个词的时候,会觉得这里的 “原型”指的是myfunction.prototype。其实不是,“原型”指的是对象的[[Prototype]]。当然,对象的 [[Prototype]]就是其真实构造器当前的prototype成员对象。  
上文中有提过,一个我们通过程序创建的function Object,一定会包含[[Call]]和[[Construct]]这2个internal成员。它们做了什么事情呢?  
[[Call]]:  
1. Establish a new execution context using F's FormalParameterList, the passed arguments list, and the this value as described in 10.2.3.  
2. Evaluate F's FunctionBody.  
3. Exit the execution context established in step 1, restoring the previous execution context.  
4. If Result(2). type is throw then throw Result(2). value.  
5. If Result(2). type is return then return Result(2). value.  
6. (Result(2). type must be normal.) Return undefined.  
[[Construct]]:  
1. Create a new native ECMAScript. object.  
2. Set the [[Class]] property of Result(1) to "Object".  
3. Get the value of the prototype property of F.  
4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).  
5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object prototype object as described in 15.2.3.1.  
6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.  
7. If Type(Result(6)) is Object then return Result(6).  
8. Return Result(1).  
一切都很清楚了。当我们创建一个对象,也就是我们new的时候,调用的是function Object的[[Construct]]成员方法。在上面的描述中,3、4步描述了[[Prototype]]成员的创建过程,就是构造器的prototype成员。  
好的,那回到之前,我们使用obj.property来获取obj对象的属性的时候,其实调用的是obj对象的internal方法[[Get]]。那我们看看[[Get]]方法调用做了哪些事情:  
1. If O doesn't have a property with name P, go to step 4.  
2. Get the value of the property.  
3. Return Result(2).  
4. If the [[Prototype]] of O is null, return undefined.  
5. Call the [[Get]] method of [[Prototype]] with property name P.  
6. Return Result(5).  
可 以看出来,当我们获取对象obj的某个成员的时候,会在obj对象自身成员里查找是否存在该成员。如果不包含,则到obj.[[Prototype]]这 个对象中查找名字成员,如果还不存在,则到obj.[[Prototype]].[[Prototype]]这个对象里找,直到某个 [[Prototype]]是null为止。查找的过程就是一个顺藤摸瓜的事情,这个藤就是我们所谓的“原型链”。  
我不想说太多原型链和继承之间的关系与实现,这方面的资料在网络上已经太多太多。我只想把原型链脱光了告诉大家,原型链是什么。  



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25897606/viewspace-704297/,如需转载,请注明出处,否则将追究法律责任。

上一篇: JavaScript中Array
下一篇: Js全局对象
请登录后发表评论 登录
全部评论

注册时间:2011-07-21

  • 博文量
    220
  • 访问量
    662300