4 - javascript原型和闭包(隐式原型)

上节已经提到,每个函数function都有一个prototype,即原型。这里再加一句话 –- 每个对象都有一个 proto ,可成为隐式原型。 这个 proto 是一个隐式的属性,js不希望开发者用到该属性,有些低版本的浏览器甚至不支持这个属性。但是你不用管他,直接写出来就是了。

var obj = {};
console.log(obj.__proto__);

输入图片说明

从上面截图来看,obj.proto 和 Object.prototype 的属性一样!这么巧!! obj 这个对象本质上是被 Object 函数创建的,因此 obj.proto === Object.prototype 。 我们可以用一个图来表示:

输入图片说明

即,每个对象都有一个 proto 属性,指向创建该对象的函数的prototype 。 那么上图中的 “Object prototype”也是一个对象,它的 proto 指向哪里? 在说明 “Object prototype”之前,先说一下自定义函数的 prototype。自定义函数的 prototype 本质上就是和 var obj = {};是一样的,都是被Object创建,所以它的 proto 指向的就是 Object.prototype 。 但是 Object.prototype 确实一个特例 - - 它的 proto 指向的是null,切记切记。

输入图片说明

还有 - - 函数也是一种对象,函数也有 __proto__吗?当然有,函数也是被创建出来的,谁创建了函数呢? - - Function - - 注意是大写的”F”。

看如下代码:

function fn(x,y){
    return x+y;
}
 console.log(fn(10,20));
 var fn1 = new Function("x","y","return x+y;");
 console.log(fn(5,6));

以上代码中,第一种方式是比较传统的函数创建方式,第二种是用 new Function创建,(不推荐使用第二种方式)。 这里只是向大家演示,函数是被Function创建的。

根据前面的总结 - - 对象的 proto 指向的是创建它的函数的prototype,就会出现:Object.proto === Function.prototype。用图来表示:

输入图片说明

上图中,很明显的标出了:自定义函数 Foo.proto 指向Function.prototype ,Object.proto 指向Function.prototype ,唉,怎么还有一个 … Function.proto 指向 Function.prototype? 这不成了循环引用了吗? 确实是一个环形结构,其实稍微想一下就明白,Function也是一个函数,函数是一种对象,也有 proto 属性,既然是函数,那么它一定是被Function创建的。所以 - - Function 是被自身创建的。所以它的 proto 指向了自身的 Prototype。

最后一个疑问?Function.prototype指向的对象,它的__proto__是不是也指向Object.prototype?

答案是肯定的。因为Function.prototype指向的对象也是一个普通的被Object创建的对象,所以也遵循基本的规则。

输入图片说明

转载于:https://my.oschina.net/u/2845293/blog/709739

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值