javascript - 对象构造函数和全局对象有什么区别

标签 javascript

我对 JS 中的 “全局对象”(窗口)“对象” 构造函数感到困惑。 令人困惑的部分是当我阅读类似的句子时,一个是在阅读作用域时,另一个是在我阅读 JavaScript 中的对象和继承时:

  1. JavaScript 中的所有对象都是 Object 的后代;所有对象都从 Object.prototype 继承方法和属性,尽管它们可能会被覆盖。
  2. 全局变量也自动成为全局对象(浏览器中的窗口等)的属性,......

我们知道的是: 我们知道 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.prototypeObject 函数的一个属性,它定义了内置原型(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/

相关文章:

javascript - 更改嵌套函数中的变量

javascript - 如何访问 Angularjs 中 Promise 内的范围?

javascript - 通过 PHP 从 MySQL 中提取位置进行地理编码

javascript - VueJS 发出的事件未被同一层次结构中的其他组件捕获

javascript - 具有 b2FixtureDef.shape.SetAsArray 的 Box2D 主体不适用于类似俄罗斯方 block 的形状

javascript - 按类名称收集元素,然后单击每个元素-Puppeteer

javascript - 无法在 Node + Express localhost 中进行 .get 调用

javascript - Phaser : how to catch the game.scale.refresh结束事件

javascript - 如何根据一天中的时间更改消息?

javascript - 在 JavaScript 中组合两个多维数组中的元素