全局对象Window
ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的)
ECMAScript规定
parseInt()
parseFloat()
Number()
String()
Boolean()
Object()
setTimeout()
浏览器自己加的属性(私有)
alert
console
prompt
confirm
document(DOM)
history (BOM)
window对象中的所有方法都可以省去window,alert()方法可以写成window.alert(),或者省去window,直接写做alert()
浏览器自己加的属性,因为没有标准,所以浏览器上呈现的效果是不一样的
简单类型与对象
Number() 区别
var n1=1 n1是个普通值
var n2 = new Number(1) n2是个hash 存在堆
同理还有:
String()
Boolean(xxx) xxx要注意5个false值
Object()
var a1={ }
var a2= new Object( )
a1 a2 都是对象 但不等
__proto__
与 prototype
上图是我们还没有写代码的时候,浏览器内存中已经构建好了的内容。
由图可知,prototype是浏览器本身就写好的。
当我们写了一句代码var s = new String(' hello ')
以后:
我们创建的对象的__proto__
会用来指向原有的String对象,使得我们可以调用String对象的公有属性。
于是我们有了以下结论:
-
__proto__
是某对象公用属性的引用,是为了用户使用其共用属性中的方法而存在的 。 -
prototype
是浏览器写的,本身就存在,是某对象的共同属性的引用,为了不让对象的公用属性因没有被调用而被垃圾回收而存在。
一些烧脑的等式
众所周知,var 对象 = new 函数;是JS中很基本的语句,如var str = new String('aaa')
,因此就有了下面这句等式:
-
对象.__proto__ === 函数.prototype
,即对象的__proto__
指向了构造这个对象的函数的prototype
。 因此我们还知道了__proto__
是对象我的属性,prototype
是函数的属性。
于是我们可以根据上述等式做一些推论:
-
首先我们知道,函数的prototype是对象,这个对象对应的就是最简单的函数Object,所以替换的到下面的式子:
函数.prototype.__proto__ === Object.prototype
-
由于函数本身即是函数(最优先视为函数),也是对象,而函数的构造函数是
Function
,所以替换得:
函数.__proto__ === Function.prototype
-
Function
即是对象,也是函数,但他优先是个函数,所以将Function
替换上面的式子,则变为:
Function.__proto__ === Function.prototype
-
而
Function.prototype
也是对象,是普通的对象,所以其对应的函数使Object,替换得:
Funciton.prototype.__proto__=== Object.prototype
神奇的Function
根据上面的各种推论,我们发现了其中最神奇的东西,Function
,他即是函数,也是对象,所以他有函数的prorotype
,也有对象的__proto__
,所以出现了下图的情况:
即Function.prototype
与Funciton.__proto__
互相引用。
另外需要注意的一点:
Object.__proto__ === Function.prototype
,因为 Function 是 Object 的构造函数。
网友评论