WuShaolin

悟已往之不谏,知来者之可追!

0%

深挖JS语法第三集

这次的内容是研究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