我使用javascript中的console
对象进行调试,并希望覆盖它,以便在移动浏览器中使用此类功能。
然而,我很难理解以下MDN文档
Window.console只读属性返回对Console对象,它提供了将信息记录到浏览器控制台。
(https://developer.mozilla.org/en-US/docs/Web/API/Window/console)
特别是:
- 我无法确定
Window
接口的实际情况,但它似乎与全局window
属性不同 - 一个测试显示(在当前的Chromium和Firefox中(window.console确实可以被覆盖事件,尽管它似乎与我在文档中读到的内容相矛盾。(这种覆盖的一个例子提供了这个答案;即使注释反对
您不能使用window.console={…},因为window.console是只读属性!–Luillyfe 2月23日21:28
Window.console
或window.console
的只读性是什么?
它不是只读的。MDN是一个很好的资源,但它是由社区编辑的,有时会出现错误或无来源的声明。
- 我无法确定
Window
接口的实际情况,但它似乎与全局窗口属性不同
接口Window
定义浏览器中窗口对象上可用的属性和方法,该属性和方法可通过默认的window
全局变量使用。你可以这样想:var window = new Window()
,当然这不是字面上的。
- 。。。
Window.console
或window.console
的只读性是什么
它不是只读的。
-
理论:
Window
接口根本没有提到console
,但console
规范说它是在window
上公开的名称空间对象。WebIDL规范规定,默认情况下,命名空间对象是可写的、可配置的和不可枚举的(感谢sideshowbarker指出这一点!( -
实践:它在我尝试过的所有浏览器上都是可写的(Chrome、Firefox、Safari、IE9、IE11、Edge(。在除IE11之外的所有类型中,
console
是window
所指对象的"自己"属性,并且为其赋值是有效的(在宽松和严格模式下(。(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中(实际上是浏览器环境的"根"对象(。