JS里的对象

JS里的对象

全局对象

global (浏览器 window

window 的属性
  • ECMA Script 规定

    • parseInt
    • parseFloat
    • Number()
    • String()
    • Boolean()
    • Object()
    • ...
  • 浏览器私有(Chrome / FireFox)

    • alert
    • prompt
    • confirm
    • console
    • document
    • history
    • ...

两种变量声明的方式

  • 为了像 java,js 诞生之初有两种声明数据类型的方式。
    1. 第一种
      var n1 = 1
      console.log(n1)  // 1
      
    2. 第二种
      var n2 = new Number(1)
      console.log(n2)  // Number {1}
      
    第一种简洁的方式被更广泛的使用。
    缺点:基本类型没有属性。
    解决方案:调用属性时生成一个临时对象,然后调用该对象的属性。
    var n = 1
    n.toString()
    // var temp = new Number(n)
    // temp.toString()
    // 结果返回给 n.toString()
    "1"
    
    注意:一旦属性调用完成,临时对象即被销毁。
    var n = 1
    n.xxx = 2  // 随即临时对象销毁
    n.xxx  // 重新生成临时对象,没有xxx属性,返回undefined
    

原型

所有对象都可以调用 toString() 和 valueOf() ,而它们自身却不一定包含这两个属性。这是原型和原型链的功劳。

为了理解原型、原型链和继承,我详细阅读并翻译了一篇英文博客:《JavaScript 核心》(1):对象、原型和继承。在这里,我用自己的理解简单总结一下:

prototype chain.png

原型链是一种类似属性继承的机制。

  • 所有对象都有 __proto__ 属性,它指向该对象的原型。通过 __proto__ 属性,实例对象可以借助原型链来调用它的原型以及它的原型的原型所拥有的属性。
  • 原型也是对象,它的 __proto__ 指向 Object.prototypeObject.prototype__proto__ 指向 null,也就是原型链的最后一环。
  • 所有的原型对象也就是 Xxx.prototype 都有一个 constructor 属性,指向该原型的构造函数。该构造函数new 出来的实例对象可以调用原型对象的 constructor 来访问到构造函数。
  • 函数也是对象,它们的 __proto__ 指向了 Function.prototype ,包括 Function 函数本身。

你可能感兴趣的:(JS里的对象)