聊聊__proto__和prototype

在js中,我们实例化一些对象时,如o1,02(Object对象),每个对象都有公共的属性,如toString,valueOf.如果我们每次实例化对象,都重新给它们这些属性值,就会很占内存。这个时候我们就把这些公共属性放在一起。然后给每个实例化对象加一个key值,这个值就是__proto__.然后我们把这些公共属性放到__proro__中,
这里写图片描述
但是实例化的Number对象(n1,n2)的toString()又和普通的Object不一样。Number对象的toString可以加参数进行进制转换,如toString(16),就是转换为16进制。我们在图中也可以看到n.toString===o.toString是false.这个时候我们就将Number的公共属性放到__proto__中,再将普通的Object公共对象放到实例化对象n的proto_下面。我们就会看到两个__proto__
这里写图片描述
我们来画个图来理解一下

这里写图片描述



下面我们来看看prototype.我们在控制台打印出Number.prototype和Object.prototype,发现和我们之前的n1.__proto__o1.__proto___是一样的。这个时候我们就说n1.__proto__===Number.prototype,也就是说这些公共属性都是封装在Number.prototype这个对象中。
这里写图片描述
这里写图片描述

这里写图片描述
根据上面画的图,我们进而就可以得到如下结论。
这里写图片描述
下面我们来看一下一个特殊的对象Function。我们知道js的数据类型并没有Function,它属于对象。但是我们在用typeof进行判断的时候,会返回给我们function类型
这里写图片描述
因此我们可以把function看作是和Number类似的类型。然后有如下等式成立

var a=function add(){}
undefined
a.__proto__===Function.prototype
true
a.__proto__===Object.prototype
false
a.__proto__.__proto__===Object.prototype
true

猜你喜欢

转载自blog.csdn.net/xiaoritai7803/article/details/79628861
今日推荐