全局对象 window
ECMAScript 规定全局对象叫做 global,但是浏览器把 window 作为全局对象(浏览器先存在的)。
window 就是一个哈希表,有很多属性。
window 的属性就是全局变量。
这些全局变量分为两种:
1. ECMAScript 规定的
- global.parseInt
- global.parseFloat
- global.Number
- global.String
- global.Boolean
- global.Object
2. 浏览器自己加的属性(私有属性)
- window.alert(弹窗提示)
- window.prompt(用户填写)
- window.comfirm(用户确认)
- window.console.log
- window.console.dir
- window.document
- window.document.createElement
- window.document.getElementById
- history
所有 API 都可以在 MDN 里找到详细的资料。
全局函数
Number
var n2 = new Number(1) 创建一个 Number 对象;
var n1=1
n1不是对象,基本类型没有属性,没有toString等属性;
进行临时转换:
temp = new Number(n1)
temp.toString()
temp是n1的一个复杂类型的封装,
temp.toString的值当作n1.toString的值;
最后干掉temp;
问题:
var n = 1
n.xxx = 2
n.xxx ?
undefined
第二行:只要一句结束,临时对象就会被清除;
String
var s2 = new String('hello') ,创建一个 String 对象;
var s='hello'
Boolean
var b2 = new Boolean(true) 创建一个 Boolean 对象;
var b = true
问题:
var f = false
var f2 = new Boolean(false)
if(f){console.log(1)}
if(f2){console.log(2)}
?
2
f2是一个对象,所有对象都是真值。
Object
var o1 = {}
var o2 = new Object()
o1 和 o2 没区别;
o1 === o2
false
不相等。
公用属性
所有对象都有 toString 和 valueOf 属性,我们不需要给每个对象一个 toString 和 valueOf 。
JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象);
然后让每一个对象的 proto 存储这个「公用属性组成的对象」的地址。
重要公式
注意大小写,number 和 Number 是不同的
var 对象 = new 函数()
对象.proto === 对象的构造函数.prototype
proto 与 prototype 的区别:
__proto__是对象的属性,
prototype是函数的属性;
推论:
-
var number = new Number()
number.proto = Number.prototype -
var object = new Object()
object.proto = Object.prototype -
var function = new Function()
function.proto = Function.prototype
所有函数都是由 Function 构造出来的,所以:
Number.proto = Function.prototype
// 因为 Number 是函数,是 Function 的实例;
Object.proto = Function.prototype
// 因为 Object 是函数,是 Function 的实例;
Function.proto == Function.prototye
// 因为 Function 是函数,是 Function 的实例。