一、JS中全局对象与浏览器中的全局对象
- JS中默认全局对象是global,而在浏览器的全局对象是window,如
window.alert('hi');window.open('http://baidu.com')
当然也可省略window,写成alert('hi');open('http://baidu.com')
window对象它的属性有两种:
- ECMAScript规定的:
parseInt,parseFloat,Number,String,Boolean,Object..etc - 浏览器私有的:
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,因为已经被销毁了

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

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

再展开_proto_:Object,会发现里面还有属性,这里面的属性就是公共属性,即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为相应变量
网友评论