1、全局对象golbal(浏览器中叫window)
单个浏览器开发工具中,global即浏览器中的window
注:Window()是一个函数,小写的window才是全局对象,window包含ECMAScript规定的属性和浏览器自带的属性,各浏览器私有属性存在差异性;
ECMAScript规定的属性:parseInt
、parseFloat
、Number
、String
、Boolean
、Object
……等等
浏览器自带的属性:alert
、prompt
、confirm
、console
、document
(DOM)、history
(BOM)……等等
2、Number对象、String对象、Boolean对象
创建Number对象:
创建String对象:
创建Boolean对象:
创建对象:
注:
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的共有属性,这个过程中数据解析通过的路径就是原型链。
由于内存垃圾回收机制存在,且内存初始化的时候原型就存在,要一直存在不被回收则必须被某个属性引用,其实际是被全局对象window的属性对应的函数引用,如下内存图:
注:从图中可以看到,内存初始化时原型就已经被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