看完这篇博客,你将了解:

1.全局对象 window
2.基本类型如何调用对象方法?
3.公用属性藏在哪?


一. 全局对象window

全局对象在浏览器中是存在的,比如window对象。
window对象,它的属性分两种:

1.ECMAScript规定的:

parseInt,parseFloat,Number,String...

2.浏览器私有的:

alert,prompt,confirm,console,document...

ECMAScript规定的

浏览器私有的

二. 临时转换

先来看一个小问题:var n = 1和var n = new Number(1)有何区别?
a:前者是基本类型,后者是对象。基本类型没有属性,而对象有自带属性。所以区别就是:后者valueOf(),toString()等Number对象自带函数,前者没有

然而,实际使用中,可以看到,前者其实可以使用后者才有的各种方法。

不是对象的n1,不断调用了Number对象才有的方法
这是因为js使用了临时转换的技巧——先用基本类型的值创建一个temp对象,再借助对象发号施令,使得基本类型就像对象一样可调方法。

从内存图出发,n.toString()这行代码其实做了这样几件事:
step1 发现基本类型在调用对象方法

step2:临时转换,产生对象

step3: 调用结束,删除对象

这就是基本类型调用对象的原理。有了这部分基础,我们再来看一个扩展问题:

q1:为什么第三行n.xxx=2不报错?
a1:因为n通过临时转换新建了一个对象,让这个对象的xxx属性为2

q2:n.xxx = ?
a2:临时转换的对象用完就消失,所以再访问n.xxx,它会再创建一个临时对象,而这个对象并没有属性xxx,所以是undefined

三. 共用属性藏在哪

一句话:藏在浏览器各全局对象的prototype中,被各种对象通过__proto__链引用

1.什么是共用属性?
为避免了每次创建对象时,各种常见属性被重复书写。将这些属性写到一起,作为一块内存,为各种对象的__proto__属性所引用。这就是共用属性。

2.以下给出了由共用属性构成的一种原型链

上图中,我们声明了10个数字对象,10个普通对象。
10个数字对象在内存中除了存储各自的值外,还借助_proto_这一键值存入了Number共用属性的引用。而Number公用属性除了罗列Number特有的函数外,也通过__proto__存入了Object共用属性的引用。
可以看出,这个过程中,一个具体对象通过__proto__层层引用各级共用属性,这种组织对象的形式很像单链表,称为“原型链”。

下图给出了原型链一个实例:

3.根据垃圾回收原理“没人引用的内存会被当做垃圾回收”,为什么Object和Number等的公用属性会一直存在?
a:因为全局对象Object和Number等一直存在,Object.prototype,Number.prototype等也一直在引用公用属性,所以它们不是垃圾。

4.prototype与__proto__的关系:
联系:
它们都是对象共用属性的引用
对象.__proto__ === (构造)函数.prototype

区别:
一句话:一个是用的,一个是防止它跑的