结合1,2节的内容,我们来理解一下上述这段代码:
首先,在执行var b=Object.create(a);之前,已经有了a对象,如下图:
在执行了var F = function () {};之后,F函数对象被创建出来,他的property属性也被赋值指向一个新创建出来的对象,详细规则在第二节描述过:
当用var ff = function(){}定义一个函数时,JS会生成一个函数对象F,函数对象F的__proto__指针指向Function.prototype(在下图中省略了), 同时F还会有一个property属性,property属性的值指向一个新创建的对象P,这个对象P只有一个属性是构造函数constructor(),构造函数constructor()的值就是函数对象F,而对象P的__proto__指针则指向Object.Prototype。
执行了F.prototype = o; 之后, F的prototype属性指向了对象A,如下图所示:
执行new F();之后,根据第2节中描述的规则,执行之后的对象关系如下:
当用new激活一个函数时,一个新对象会被创建出来,其内容是执行函数的返回结果,而这个对象的__proto__链接指向函数的prototype属性所引用的对象
函数Object.create返回之后,F和p都不存在了,因此,最后的对象关系如下:
总结一下,我们可以看到,对象的__proto__链接是不能直接修改的,而函数对象的prototype属性是可以修改的,因此,Object.create实际上是利用了这个特点,结合new来完成了一个拷贝创建的过程,希望这个例子能够帮助大家更好地理解!!
可继续阅读 4. Scope和Object http://blog.csdn.net/adwu73/article/details/7229564
补记:推荐大家去看一下这个博客,解释的会更详细,有更多例子: http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html