原型与原型链
一、全局对象
ECMAScript把全局对象成为global,但浏览器里全局对象成为window
全局对象分为两种:
1.ECMAScript规定好的,如:global.parseInt、global.parseFloat、global.Number、global.String、global.Boolean、global.Object
2.浏览器私有的,如:window.alert、window.prompt、window.confirm、window.console.log、window.document
所有API都可以在MDN找到相关资料。
二、全局函数(简单类型与对象的区别:内存不同)
1.Number
n和m都是声明数字1,但打印出来的结果不一样上图n、m都是声明了数字1,但第一个方法可以看到n只打印出1,而方法二打印出一个对象,该对象里除了一个名为[[PrimitiveValue]]: 1的东西,还有一个_proto_(下文再说明_proto_是什么)
结合上一篇《JS里的数据类型转换》中内存图的只是,我们可以知道普通类型在声明的时候是把数据放到Stack(栈内存)中,他们并没有任何key(key是对象才有)。那么为何我们在转换类型的时候可以直接写x.toString()呢(如图二)?
图二这是因为当写这句语句时浏览器把该声明语句作了临时的改变,转换成图三的类型。可以看到图三中对象Number{1}中的_proto_里有一个toString的key。这就是为什么我们可以直接写x.toString
图三2.String
与Number一致
3.Boolean
留意下图:
a什么也没打印,但b能打印出来。这是因为b声明了一个对象,而对象的布尔值为true4. var o = {} 与var o = new Object()没有区别
三、公用属性(原型)
所有对象都有 toString 和 valueOf 属性,所以没有必要给每一个对象一个toString 和 valueOf 属性。JS的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象),然后让每一个对象的 __proto__ 存储这个公用属性组成的对象的地址。解释如下图:O1和O2中都有一个名为_proto_的对象,他们都指向同一个属性。
四、重要公式
var 对象 = new 函数()
对象.__proto__ === 对象的构造函数.prototype
如何理解_proto_与prototype的区别呢?(简单来说,prototype是没有任何代码时浏览器已经准备好的,_proto_是写了代码以后出现的,他们都指向同一个地方)