从全局对象到原型及原型链

1、全局对象golbal(浏览器中叫window)

单个浏览器开发工具中,global即浏览器中的window

从全局对象到原型及原型链_第1张图片
global及window

注:Window()是一个函数,小写的window才是全局对象,window包含ECMAScript规定的属性和浏览器自带的属性,各浏览器私有属性存在差异性;

ECMAScript规定的属性:parseIntparseFloatNumberStringBooleanObject……等等
浏览器自带的属性:alertpromptconfirmconsoledocument(DOM)、history(BOM)……等等

2、Number对象、String对象、Boolean对象

创建Number对象:
从全局对象到原型及原型链_第2张图片
Number对象
创建String对象:
从全局对象到原型及原型链_第3张图片
String对象
创建Boolean对象:
从全局对象到原型及原型链_第4张图片
Boolean对象
创建对象:
从全局对象到原型及原型链_第5张图片
对象

注:var obj1={}var obj2=new Object()这两种声明对象的方式得到同样内容的对象,但因存储地址不同是不相等的;

普通声明时的toString等共有属性调用:
var n = 1
n.toString() // 这个解析过程如下代码
// temp = new Number(n)
// temp.toString()

3、原型及原型链(个人理解)

原型通过如下代码的内存图来说明:
var n= new Number(1)
var n= new String('Hi')
var n= new Boolean(true)
var n= new Object()
下图,s1、s2为字符串对象,n1、n2为数值对象,b1、b2为布尔值对象,相同类型的对象的__proto__属性都指向该类型对象的共有属性,这个共有属性就是该类型对象的原型。由于基本类型对象的原型也是属于对象,因此它们也具有对象的原型,对象共有属性中的__proto__属性没有原型,该属性存储的值是null。单个类型的原型属性最终都指向Object的共有属性,这个过程中数据解析通过的路径就是原型链。
从全局对象到原型及原型链_第6张图片
原型及原型链内存图
由于内存垃圾回收机制存在,且内存初始化的时候原型就存在,要一直存在不被回收则必须被某个属性引用,其实际是被全局对象window的属性对应的函数引用,如下内存图:
从全局对象到原型及原型链_第7张图片
初始化原型内存图

注:从图中可以看到,内存初始化时原型就已经被window对应函数的prototype属性引用。

通过内存图我们可以得出如下几个等式成立的结论:

n1.__proto__ === Number.prototype  //true
s1.__proto__ === String.prototype  //true
b1.__proto__ === Boolean.prototype  //true
obj1.__proto__ === Object.prototype  //true

4、原型及原型链总结:

通过内存图分析,上面几个等式可以总结归纳为下列式子:

var 对象 = new 函数()

对象.__proto__ === 函数.prototype

结论:即每个对象的__proto__属性都等于构造它的函数的prototype属性。那么如下等式是成立的:

函数.prototype.__proto__ === Object.prototype
函数.__proto__ === Function.prototype
Object.__proto__ === Function.prototype //重点,因Object构造函数是Function
Function.__proto__ === Function.prototype ////重点,因Function构造函数是Function

你可能感兴趣的:(从全局对象到原型及原型链)