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



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

然而,我很难理解以下MDN文档

Window.console只读属性返回对Console对象,它提供了将信息记录到浏览器控制台。

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

特别是:

  1. 我无法确定Window接口的实际情况,但它似乎与全局window属性不同
  2. 一个测试显示(在当前的Chromium和Firefox中(window.console确实可以被覆盖事件,尽管它似乎与我在文档中读到的内容相矛盾。(这种覆盖的一个例子提供了这个答案;即使注释反对

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

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

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

  1. 我无法确定Window接口的实际情况,但它似乎与全局窗口属性不同

接口Window定义浏览器中窗口对象上可用的属性和方法,该属性和方法可通过默认的window全局变量使用。你可以这样想:var window = new Window(),当然这不是字面上的。

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

它不是只读的。

  • 理论Window接口根本没有提到console,但console规范说它是在window上公开的名称空间对象。WebIDL规范规定,默认情况下,命名空间对象是可写的、可配置的和不可枚举的(感谢sideshowbarker指出这一点!(

  • 实践:它在我尝试过的所有浏览器上都是可写的(Chrome、Firefox、Safari、IE9、IE11、Edge(。在除IE11之外的所有类型中,consolewindow所指对象的"自己"属性,并且为其赋值是有效的(在宽松和严格模式下(。(IE11是一个奇怪的鸭子:当devtools关闭时,console不是window自己的属性,但它的类型是"object",如果你记录String(console),结果是"[object Console]"。但当devtoolss打开时,它是window自己的属性而不是只读的。(

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

我并不是说用其他东西替换console是个好主意。:-(但请注意,如果您选中了"显示控制台"选项(默认情况下是这样(,SO自己的堆栈代码段正是这样做的。

Window是一个用JS引擎的本机代码编写的接口(就像V8中的C++一样(。它是window全局变量的原型,它将此接口公开给JavaScript。

我认为这是造成混乱的主要原因——您无法覆盖Window.console,因为您无法通过JavaScript与Window真正交互。但是,您可以使用window.console来实现这一点,因为此对象暴露在JavaScript中(实际上是浏览器环境的"根"对象(。

最新更新