-
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
-
首先回顾一下:
JavaScript
的对象
JavaScript
是面向对象的编程
对象的分类
运行的环境提供的对象
- 直接可以使用的对象
- 比如浏览器环境下:
window
是全局对象,node
环境里,就没有这个全局对象,不能直接使用window
对象。
- 比如浏览器环境下:
- 运行环境提供了可以生成对象的构造方法
- 比如浏览器API
JavaScript
的内置对象
- 与
c++
/java
类似的基础库的角色- 比如“类”这一种对象
- 原生对象
- 比如
RegExp
、Array
、Map
、Proxy
、Promise
、Set
、Function
等 - 这些对象,可以通过
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
对象有其他观点,欢迎留言讨论。