在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