Javascript 对象构造函数和全局对象之间有什么区别

Javascript 对象构造函数和全局对象之间有什么区别,javascript,Javascript,我对JS中的“全局对象”(窗口)和“对象”构造函数感到困惑。 令人困惑的是,当我阅读类似的句子时,一个是关于范围的,另一个是关于JavaScript中的对象和继承的: JavaScript中的所有对象都是对象的后代;所有对象都从Object.prototype继承方法和属性,尽管它们可能被重写 全局变量也是全局对象(浏览器中的窗口等)的自动属性 我们知道的是: 我们知道JavaScript中的所有对象都是从“Object”继承的,即根对象!JavaScript中的所有对象都继承自其原型,包括内置

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

  • JavaScript中的所有对象都是对象的后代;所有对象都从Object.prototype继承方法和属性,尽管它们可能被重写
  • 全局变量也是全局对象(浏览器中的窗口等)的自动属性
  • 我们知道的是: 我们知道JavaScript中的所有对象都是从“Object”继承的,即对象!JavaScript中的所有对象都继承自其原型,包括内置对象的原型,如“数组

    另一方面,当我们谈论作用域时,我们有一个称为全局作用域的东西,它是根作用域,本身称为全局对象。 以及:

    我知道这可能是两个完全不同的问题。 那么什么是什么?哪条路通向哪条路?谁是谁


    它们之间有关系吗?对象
    构造函数是一个创建(或将原语转换为)对象的函数

    Array.prototype.__proto__===Object.prototype  //True
    
    对象。prototype
    对象
    函数的一个属性,该函数定义内置prototype链的根。大多数JavaScript对象最终都会从中继承,尽管可以创建不继承的对象

    全局对象是全局变量所在的位置。与大多数对象一样,它继承自
    Object.prototype
    (虽然这更像是一个事实上的标准;规范实际上并不需要它,但大多数引擎都需要它)。因为
    对象
    构造函数绑定到一个全局变量,所以它也存在于这里

    请注意,在不同的运行时上下文中,全局对象也可以从其他对象继承,只要它继续满足通常的要求。例如,在浏览器中,全局对象继承自
    Window
    (普通上下文)或
    WorkerGlobalScope
    (Web工作者)


    在许多上下文中,全局对象也绑定到全局变量。历史上,浏览器在普通上下文中称之为
    窗口
    ,但
    self
    (最初是Web工作者的一部分)在HTML5中也被标准化。与所有全局变量一样,这些名称成为全局对象的属性:在普通浏览器中,如果您真的愿意,可以将其称为
    window.self.window.self.window

    window仅在浏览器中是全局对象。范围和对象是两个完全无关的概念。你在问苹果和想象的区别。窗口对象不是全局范围。它只是全局范围内的另一个对象。不!窗口是一个对象(句号)。全局范围是包含窗口对象的概念。将它们混合在一起并假定窗口是全局范围。在ECMAScript中,对象(包括全局对象)不能同时从多个对象继承。因此,全局对象仅从单个对象继承,该对象依赖于实现,通常不是
    对象。prototype
    @Oriol:对象不能直接从多个对象继承,但它们可以通过prototype链间接继承。全局对象通常会返回到
    对象。原型最终会返回到
    对象,但这通常不是直接的;正如您所说,它通常直接从其他对象继承,而其他对象又(直接或间接)从
    对象继承。prototype
    。好的,但是规范仍然没有说全局对象(直接或通过prototype链)从
    对象继承。prototype
    @Oriol:很公平。我一定是看错了那个的规格。然而,在实践中,我尝试过的每个引擎似乎要么将
    Object.prototype
    放在全局对象的原型链中,要么至少以其他方式将其大部分(如果不是全部的话)属性指定给全局对象。Chrome和Firefox确实如此,IE在其最新版本中也是如此(尽管我不知道这要追溯到什么时候)。目前我还没有Node.js要测试,不过如果它没有使用与Chrome相同的引擎,我会觉得很奇怪。Rhino有,尽管我还没有测试Nashorn。
    > Window.prototype.__proto__
    Result : EventTarget { addEventListener=addEventListener(),    removeEventListener=removeEventListener(),  dispatchEvent=dispatchEvent(),  more...}
    
    > window.__proto__
    
    Result : Window { addEventListener=addEventListener(),  removeEventListener=removeEventListener(),  dispatchEvent=dispatchEvent(),  more...}