Javascript中Function,Object,Prototypes,__proto__等概念是在JavaScript中很常用,但又总是不清不楚的概念。今天主要是解释他们之间的概念和关系,帮助我们更好的理解Javascript。
function
Object(){[native code]}//Javascript自带,不是自定义的,可以近似认为是基类
function
Function(){[native code]}//Javascript自带,不是自定义的,可以近似认为是基类
这里的这两个function,分别走两个方向,
Object作为了众多object(实例,new出来的)的基类型
Function作为众多function(主要是那些function出来的,就是定义出来的函数)的基类型
在开始下面更细致的解释先,我们约定一些内容,Object代表这里所说的Object,object代表实例对象
,Function代表这里说的Function,function是关键字。对于Object与object的区别很好理解,一个是function,一个是new出来。
现在让我们思考两个问题:
第一个,当我们扩展Object原型时,new出来的Function,是否会被扩展?
第二个,当我们扩展Function原型时,由于Object也是个Function,那么其实例object是否会被扩展?
先看第一个问题,上代码:
扩展Object原型
Object.prototype.test4extend="123";//扩展Object的原型
alert("Function:"+Function.test4extend);//在Function中出现了test4extend属性
alert("Object:"+Object.test4extend);//在Object中出现了test4extend属性,此时Object还是个Function
var obj=new Object;
alert("Object instance:"+obj.test4extend);//在obj中扩展了test4extend,此时的obj是object
function Foo()
{
}
var foo = new Foo;
alert("foo object:"+foo.test4extend);//foo对象上扩展上了test4extend属性
alert("Foo Function:"+Foo.test4extend);//函数上也扩展上了test4extend属性
注释已经写得很清晰了,通过以上几点我们很容易发现以下几点:1、Object扩展了所有的object(obj,foo)。
与object扩展自Object是相符的。在这里更加验证了。
2、Object扩展了Function
这点说明Function扩展自Object,说明Object比Function更底层些。
3、Object扩展了自身的属性,即Object.test4extend也是可以的。
这点说明,Object扩展了Function,又因为Object本身又是通过function定义出来的,所以会受到Function影响,所以,反过来Function又扩展了Object。
接下来看看第二个问题:
Function.prototype.test4extend="123";//扩展Function的原型
alert("Function:"+Function.test4extend);//在Function中出现了test4extend属性
alert("Object:"+Object.test4extend);//在Object中出现了test4extend属性,注意此时Object是个Function
var obj=new Object;
alert("Object instance:"+obj.test4extend);//在obj中没有扩展上test4extend,此时的obj是object
function Foo()
{
}
var foo = new Foo;
alert("foo object:"+foo.test4extend);//foo对象上没有扩展上test4extend
alert("Foo Function:"+Foo.test4extend);//Function扩展上了test4extend属性
这说明Function只管没有被实例化得,被实例化的,他是没有办法管的。与Object不同,Object是无论是否实例化都管的。简单来说就是__proto__扩展出来,只有函数可以直接访问,prototype扩展出来的,只有对象才能直接访问。
对于关系:
首先要明确
在Object中__proto__是Function,prototype是Object。
在Function中__proto__是Function,prototype也是Function。
现在让我们再来结合第三行的图看一看。有如下关系。
Function.__proto__就是(===)Function.prototype
Object.__proto__就是(===)Function.prototype
先看类型,等号两边都是一致的。
所以,我们可以有如下结论:
1、Function的__proto__和prototype就是一个,扩展任何一个都是相同的效果。
2、Object的__proto__就是Function.prototype。当我们扩展Object.__proto__时,就相当于扩展了Function.prototype和__proto__,反之亦然。
结合前面__proto__和prototype区别的分析,我们可以进一步的解释出,Object和Function之间关系的形成原因。
当Function.prototype.test4extend="123";扩展Function的原型时,因为Function.prototype=Object.__proto__,又因为Function.prototype=Function.__proto__。所以Object.test4extend就存在了。
而对于Object.prototype.test4extend="123"扩展Object的原型时Function.test4extend存在,则实实在在的说明了Function扩展自Object的。
【总结】Function扩展自Object,但是Function对Object又有影响,这是通过Object.__proto__就是(===)Function.prototype建立的联系。记住这个联系后,我们还要记住__proto__和prototype的区别,前者扩展的只可以被Function直接调用,后者扩展的只可以通过其实例调用。另外,还要注意__proto__和prototype的链的概念,这是因为,他们可以互相关联,访问到Function或Ojbect的内容。
转载 : http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89%E6%A6%82%E5%BF%B5%E8%AF%A6%E8%A7%A3/