前端系统课程 - 22. JavaScript 里的对象

全局对象

  • 浏览器是 JavaScript 的宿主环境之一;浏览器特有的全局对象(global)是 window 对象。

  • 全局对象的属性(或方法)分为公共属性和私有属性;公共属性是指 ECMAScript 规定的属性,而私有属性是不同的宿主环境特有的属性,例如浏览器中的全局对象是 window 对象,它的私有属性常见的例如:document 对象、history对象、alert()prompt()confirm() 等等。

基本数据类型与对象的区别

  • 基本数据类型没有且不能具备属性和方法,而复杂数据类型(对象)可以具备属性和方法。

  • 使用 new 运算符可以创建一个指定对象的实例,例如 var num = new Number(1)

  • 当我们平时在对存有基本数据类型的变量使用 toSring() 等方法时,由于数据没有这些方法,所以编译器会隐性地临时将基本数据类型转换为对象,然后再调用其指定的方法,得出结果并返回,之后临时对象会被销毁。

  • 当给一个基本数据类型添加属性时,编译器不会报错,它会像前面一样将基本数据类型转换为对象,再给这个临时对象添加属性,之后这个临时对象被销毁,也就访问不到添加给基本数据类型的属性了。

公共属性

  • 每个对象都有 __proto__ 这个隐藏属性,它内部保存着对象的公共属性,其实就是从父对象继承来的属性;它引用的是父对象的 prototype 属性,所有对象不管继承了多少层,最终都会有一条“链”引到 Object 对象的 prototype,这就是原型链。

  • 从上一条可以知道,在 JavaScript 中,所有的对象,包括内置对象,都是 Object 对象的实例。

  • 继承:实例.__proto__ === 父函数.protorype函数.prototype.__proto__ === Object.prototype

  • __proto__ 是用来引用父函数的 prototype 属性的,类似于上线下线的关系,而 __proto__ 就是下线。

函数的原型链

Function 对象的 __proto__ 属性引用的是 Function 自身的 prototype,这是内置对象中的特殊情况;而 Object 对象的 __proto__ 属性引用的也是 Function 对象的 prototype,这是因为 Object 对象也是由函数构造的。