这次的内容是研究JS里面的对象
在研究对象之前,我们先研究一下全局对象。
那么什么是全局对象呢?ECMAScript规定全局对象是global,但是浏览器有规定window是全局对象。
window就是一个hash表。
window的属性就是全局变量。
两种全局变量
- 第一种是ECMAScript规定的,常见的有如下几种
- global.parseInt
- global.parseFloat
- global.Number
- global.String
- global.Boolean
- global.Obejct
- 第二种是浏览器规定的
- window.alert
- window.prompt
- window.comfirm
- window.console.log
- window.console.dir
- window.document 要格外注意这是window的,是由W3C规定的。
- window.document.createElement
- window.document.getElementById
先认识一下第一种的全局函数
Number
搞清楚var a = 1 和 var a = new Number(1)的区别是啥
var a = 1 typeof a "number" var a = new Number(1) typeof a "object"
使用了Number全局函数了,就要画上节课的内存图,来分析
String
‘hello’ 与 new String(‘hello’) 的区别是什么
Boolean
true 与 new Boolean(true) 的区别是什么
Object
var o1 = {}和var o2 = new Object()的区别是什么
上面的区别都是简单类型和对象的区别,那到底有区别呢?
上图就是以Number全局函数为例的具体调用过程,String()
Boolean
Object()
都是类似的过程
公有属性藏到哪里了呢
通过上图我们发现,JS把一些大家都公有的东西抽离出来,放到一个单独的地方,谁想调用,就通过自己的一个proto的属性去调用,可以省的每个对象自己都存 toString()
valueOf()
这种公共的方法。
在调用的过程中,自己的特有属性又放到自己的对应的公有属性里面。
由此形成了原型链。
一个伟大的等式
var 对象 = new 函数()
那么必然有 对象.proto === 函数.prototype
而函数.prototype又可以看做一个对象,那么 函数.prototype.proto === Function.prototype
而Function 也是对象啊,那么 又有 Function.proto === Function.prototype
而 Function.prototype又可以被看做对象,那么 Function.prototype.proto === Object.prototype
以上几个式子中要格外注意Function的那个式子,自己的proto又指向了自己的prototype
f.__proto__ === Function.prototype
true
f.__proto__ === Object.prototype
false
f.__proto__.__proto__ === Object.prototype
true
最有一点要强调的是Object.proto 是真的指向了null