你可能需要知道的前端小知识——JavaScript的对象

169 阅读2分钟

JavaScript的对象

JavaScript是面向对象的编程

对象的分类

运行的环境提供的对象

  • 直接可以使用的对象
    • 比如浏览器环境下:window是全局对象,node环境里,就没有这个全局对象,不能直接使用window对象。
  • 运行环境提供了可以生成对象的构造方法
    • 比如浏览器API

JavaScript的内置对象

  • c++/java类似的基础库的角色
    • 比如“类”这一种对象
  • 原生对象
    • 比如RegExpArrayMapProxyPromiseSetFunction
    • 这些对象,可以通过new运算创建新的对象,但是无法用class/extend语法来继承
    • 无法继承的原因在于这类原生对象使用了一些私有属性,因为这些私有属性不能被原型继承。可以认为这些原生对象是因为他们特殊的能力被设计出来。(后面附有一个小实验)

普通对象

  • 即代码中常用的可以自定义的对象,这些对象能被继承。

对象的生成

对象是怎么生成的呢?

  • new + 构造方法

能不能不定义构造方法呢?

  • 当然可以。
  • Object.create()就可以做到:可以为创建的对象选择一个原型对象,而不用定义构造方法。

一个小实验

function test() {
    this.a = 'hello';
    return {
        getFun:()=> this.a
    }
}
var t = new test();
t.getFun() //hello
  • 通过这样的包装之后,这个a在外部永远无法访问到。为什么会这样呢?
    • Function对象中的私有属性[[call]][[construct]]有关。
      • [[call]]体现在函数执行,比如test()
      • [[construct]]体现在作为构造方法使用,比如new test(),创建过程是用原型创建了一个对象,然后执行[[call]],如果[[call]]返回的是对象,就返回这个对象,如果不是,就返回之前用原型创建的对象。因为代码中没有定义[[call]],所以但会的就是使用原型创建的对象,这个对象就只能通过构造方法来访问。

总结

JavaScript的对象基本上就是这些内容了,还有一些私有属性的内容,平时也不常用,在最后介绍了一点。 对JavaScript对象有其他观点,欢迎留言讨论。