可以覆盖window.console吗?它是只读的吗?

时间:2018-12-07 09:42:29

标签: javascript browser

我使用javascript中的console对象进行调试,并希望覆盖该对象,以便在移动浏览器中使用此类功能。

但是,我无法理解以下MDN文档

  

Window.console只读属性返回对以下内容的引用:   控制台对象,提供将信息记录到   浏览器的控制台。

https://developer.mozilla.org/en-US/docs/Web/API/Window/console

尤其是:

  1. 我无法对Window接口的实际情况做正面或反面,但它似乎与全局window属性不同
  2. 一项测试显示(在当前的Chromium和Firefox中)window.console确实可以被覆盖,尽管这似乎与我在文档中阅读的内容相矛盾。 (这样的覆盖示例提供了this answer;即使注释对象带有
  

您不能使用window.console = {...},因为window.console是   只读属性! – Luillyfe 2月23日21:28

Window.consolewindow.console的只读性是什么?

2 个答案:

答案 0 :(得分:4)

它不是只读的。 MDN是一个很好的资源,但是它是由社区编辑的,有时会出现错误或无来源的声明。

  
      
  1. 我无法对Window界面的实际情况做正面或反面,但它似乎与全局窗口属性不同
  2.   

接口Window定义了浏览器中窗口对象上可用的属性和方法,可通过默认的window全局变量获得这些属性和方法。您可以这样认为:var window = new Window()当然不是 literally true。

  
      
  1. ... Window.consolewindow.console的只读性是什么?
  2.   

它不是只读的。

  • 理论Window interface根本没有提到console,但是console spec表示这是{{ 1}}。 WebIDL规范指出,namespace objects在默认情况下是可写的,可配置的并且不可枚举。 (感谢sideshowbarker指出这一点!)

  • 实践:在我尝试过的所有浏览器(Chrome,Firefox,Safari,IE9,IE11,Edge)上均可写。在除IE11之外的所有其他语言中,window是对象console所引用的对象的“拥有”属性,对其进行分配是可行的(在松散模式和严格模式下)。 (IE11是奇怪的鸭子:关闭devtools时,window不是console的专有属性,但是其类型为window,如果您登录"object",则结果为String(console)。但是打开devtools时,它是"[object Console]"的专有属性,而不是只读的。)

我已经更新了MDN页面,删除了该句子的“只读”部分。

我并不是说用其他东西代替window一个好主意。 :-)但是请注意,如果您选中了“显示控制台”选项(默认情况下),那么SO自己的堆栈摘录就完全可以做到这一点。

答案 1 :(得分:2)

Window 是用JS引擎的本机代码(例如在V8中为C ++)编写的接口。它是 window 全局变量的原型,该原型将此接口暴露给JavaScript。

我认为这是造成混乱的主要根源-由于无法真正通过JavaScript与 Window 进行交互,因此您无法覆盖Window.console。但是,您可以使用window.console进行此操作,因为该对象已暴露给JavaScript(实际上是浏览器环境的“根”对象)。