我对 JS 中的 “全局对象”(窗口) 和 “对象” 构造函数感到困惑。 令人困惑的部分是当我阅读类似的句子时,一个是在阅读作用域时,另一个是在我阅读 JavaScript 中的对象和继承时:
- JavaScript 中的所有对象都是 Object 的后代;所有对象都从 Object.prototype 继承方法和属性,尽管它们可能会被覆盖。
- 全局变量也自动成为全局对象(浏览器中的窗口等)的属性,......
我们知道的是: 我们知道 JavaScript 中所有的对象都是继承自“Object”,也就是 root 对象! JavaScript 中的所有对象都继承自其原型(prototype),包括“Array”等内置对象的原型(prototype)。
Array.prototype.__proto__===Object.prototype //True
另一方面,当我们谈论作用域时,我们有一个叫做 global 作用域的东西,它是根作用域,它本身称为 global object。 并且:
> Window.prototype.__proto__
Result : EventTarget { addEventListener=addEventListener(), removeEventListener=removeEventListener(), dispatchEvent=dispatchEvent(), more...}
和
> window.__proto__
Result : Window { addEventListener=addEventListener(), removeEventListener=removeEventListener(), dispatchEvent=dispatchEvent(), more...}
我知道这可能是两个完全不同的问题。 那么什么是什么?哪个导致哪个?谁是谁?
它们之间有什么关系吗?
最佳答案
Object
构造函数是一个创建(或将原语转换为)对象的函数。
Object.prototype
是 Object
函数的一个属性,它定义了内置原型(prototype)链的根。 大多数 JavaScript 对象最终都继承自它,尽管可以创建不继承的对象。
全局对象是全局变量所在的地方。像大多数对象一样,它继承自 Object.prototype
(尽管这更像是一个事实上的标准;规范实际上并不需要它,但大多数引擎还是这样做了).因为 Object
构造函数绑定(bind)到全局变量,所以它也存在于此。
请注意,在不同的运行时上下文中,全局对象也可以从其他对象继承,前提是它继续满足通常的要求。例如,在浏览器中,全局对象继承自 Window
(普通上下文)或 WorkerGlobalScope
(Web Workers)。
在许多情况下,全局对象也绑定(bind)到一个全局变量。历史上,浏览器在普通上下文中调用此 window
,但 self
(最初是 Web Workers 的一部分)也在 HTML5 中被标准化。与所有全局变量一样,这些名称成为全局对象的属性:在普通浏览器中,如果您确实愿意,可以将其称为 window.self.window.self.window
。
关于javascript - 对象构造函数和全局对象有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30941872/