我对JS中的“全局对象”(窗口)和“对象”构造函数感到困惑。 令人困惑的部分是当我读到相似的句子时,一个是在读取范围时读取的,另一个是在我阅读JavaScript中的对象和继承时:
我们所知道的是: 我们知道JavaScript中的所有对象都是从“对象”继承而来的,它是 root 对象! JavaScript中的所有对象都从其原型继承而来,包括内置对象的原型,如“数组”。
Array.prototype.__proto__===Object.prototype //True
另一方面,当我们谈论Scopes时,我们有一个名为 global 范围的东西,它是根本范围,它本身称为全局对象。 而且:
> Window.prototype.__proto__
Result : EventTarget { addEventListener=addEventListener(), removeEventListener=removeEventListener(), dispatchEvent=dispatchEvent(), more...}
和
> window.__proto__
Result : Window { addEventListener=addEventListener(), removeEventListener=removeEventListener(), dispatchEvent=dispatchEvent(), more...}
我知道他们可能是两个完全不同的问题。 那么什么是什么?哪导致哪?谁是谁?
他们之间有什么关系吗?
答案 0 :(得分:3)
Object
构造函数是一个创建(或将基元转换为)对象的函数。
Object.prototype
是Object
函数的一个属性,它定义了内置原型链的根。 大多数 JavaScript对象最终都是从它继承的,尽管可以创建没有的对象。
全局对象是全局变量存在的地方。与大多数对象一样,它继承自Object.prototype
(虽然这更像是事实上的标准;规范实际上并不需要它,但大多数引擎仍然会这样做)。因为Object
构造函数绑定到全局变量,所以它也存在于此处。
请注意,在不同的运行时上下文中,全局对象也可以从其他对象继承,前提是它继续满足通常的要求。例如,在浏览器中,全局对象继承自Window
(普通上下文)或WorkerGlobalScope
(Web Workers)。
在许多情况下,全局对象也绑定到全局变量。历史上,浏览器在普通上下文中称为window
,但self
(最初是Web Workers的一部分)也在HTML5中标准化。与所有全局变量一样,这些名称成为全局对象的属性:在普通浏览器中,如果您真的想要,可以将其称为window.self.window.self.window
。