原型与原型链

一、全局对象

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声明了一个对象,而对象的布尔值为true

4. 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_是写了代码以后出现的,他们都指向同一个地方)


你可能感兴趣的:(原型与原型链)