什么是Window和window的区别?

20

什么是 Window

这是我在Chrome控制台上看到的内容:

    window
    Window {top: Window, window: Window, location: Location, external: Object, 
chrome: Object…}

    Window
    function Window() { [native code] }

2
Window.foo = "Bar"; typeof foo; -> "undefined". 所以,不行。 - Felix Kling
@Felix Kling 我一直通过 Window.foo 访问变量,所以我从未注意到直接引用 foo 的问题。 - Jon
这只是表明在 Window 上设置属性可以生效,这并不令人惊讶(因为它是一个对象)。 - Felix Kling
同意,看起来我应该更早地注意到发生了什么。 - Jon
2
将来,像这样的问题可以通过进行一些研究来改进,例如查阅Mozilla开发者网络参考中的Window - user456814
3个回答

32

Window 是一个函数,正如您所看到的那样。它是窗口的构造函数(但您不能直接使用构造函数构建新窗口,通常使用Window.open 函数)。Window.prototype 包含您可以在窗口上调用的方法。

window 是全局变量,保存着 Window 的一个实例,表示包含文档的浏览器窗口(现代浏览器中通常不是真正的“窗口”,而是一个选项卡)。

您可以进行检查。

window instanceof Window
true

1
构造函数?为什么 new Window() 返回错误? - zloctb
2
@zloctb 因为脚本无法以这种方式构建新窗口,所以必须使用 Window.open 函数。 - Denys Séguret
3
你可以使用 var x = Object.create(Window.prototype) 来创建一个 Window 实例,并且现在 xWindow 的一个实例。然而,由于它没有绑定到你浏览器中当前的窗口,因此 x 和已经存在的 window 实例不相同。因此,window 有更多的本地属性。例如,x.Location 将不存在,还有其他一些属性。 - Nope
2
这是一个与http://stackoverflow.com/q/23547708/218196重复的问题,但是你的答案实际上更好。我们是否应该将另一个问题关闭为此问题的重复? - Felix Kling
1
@FelixKling 看起来还好。但出于明显的原因,我不会亲自去做。 - Denys Séguret
2
另一方面,另一个问题的措辞更好。我会标记合并。 - Felix Kling

12

Window 是用于创建 window 的构造函数。

要查看这一点,请尝试 alert(window.constructor === Window)


这很有道理。所以当我向Window添加一个变量时,它实际上是将其存储在Window对象中,而不是像使用window.foo一样创建全局变量。 - Jon
正确。Javascript是大小写敏感的;它们仅在大小写上不同这一事实是无关紧要的。 - SLaks
2
进一步混淆,请尝试 Window.prototype - SLaks
1
为什么人们说alert,而不是console.log? - Suraj Jain

2

来自Chrome浏览器的控制台输出:

console.log(window instanceof Window);      // true
console.log(window.constructor === Window); // true
console.log(this);   // Window {document:document, alert:ƒ, setTimeout:ƒ,..}
console.log(window); // Window {document:document, alert:ƒ, setTimeout:ƒ,..}
console.log(Window); // ƒ Window() { [native code] }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接