JS中的全局对象、原型与原型链

一、JS中全局对象与浏览器中的全局对象

  • JS中默认全局对象是global,而在浏览器的全局对象是window,如window.alert('hi');window.open('http://baidu.com')当然也可省略window,写成alert('hi');open('http://baidu.com')
    window对象它的属性有两种:
  1. ECMAScript规定的:
    parseInt,parseFloat,Number,String,Boolean,Object..etc
  2. 浏览器私有的:
    alert,prompt,console, document,history,setTimeout..etc
  • 注:浏览器不同私有属性的呈现可能不同


    qq浏览器

    edge浏览器

二、基本类型声明时调用对象方法

看个例子,以下number类型的声明有什么区别?

var n1=1;
var n2=new Number(1)

答:两种用法除了在内存存储方面有不同之外,其他一样,第二种是js之父仿照java的用法.

两种声明的内存存储示意图

看一下里面n1,n2里面到底是什么?
代码图

可以看到,n1就只存了数据1,n2是一个obj,里面除了1还存储了其他内容,那为什么n1这种基本类型,还会有属性呢?eg.n1.toString()
是因为每当使用n1.xxx的时候,js会自动先生成一个临时变量temp,var temp=new Number(n1)
让n1.xxx=temp.xxx,使用后立即销毁temp,所以当给n1.xxx赋值后,立马去取这个值会返回undefined,因为已经被销毁了
返回undefined

三、共用属性与原型链

展开对象n2,会发现里面除了有原本的值外,还有_proto_:Number,并没toString之类的属性.

obj number

那么tostring属性来自于哪里呢,再展开_proto_,发现里面包含了部分属性,这里面的属性就是Number的私有属性,并且还有_proto_:Object,
__proto__:number

再展开_proto_:Object,会发现里面还有属性,这里面的属性就是公共属性,即object属性,
__proto__:Object

当执行n1.xxx时,js首先会遍历自身属性,若没有,则会在自身的_proto_指定的地址找,若还没找到.则会在
_proto_中的_proto_指定地址找,直到出现结果为止.

  • 引申
    除了Number,还有String,Boolean有自己的私有属性,object的属性为公共属性,他们的地址引用关系可以用下图来表示,其中金色线表示其中的一条原型链


    示意图
  • 当初始化时,浏览器做了关于原型的哪些事?
    没写代码就有prototype

    其中各个函数的prototype就是原型,另外可以看出String.prototype===s.__proto__
    可得出
xxx1.prototype===x.__proto__;//xxx1为String,Number,Boolean,x为相应变量
Object.prototype===x.__proto__.__proto__;//x为相应变量

你可能感兴趣的:(JS中的全局对象、原型与原型链)