全局对象
浏览器是 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
对象也是由函数构造的。