我使用javascript中的console
对象进行调试,并希望覆盖该对象,以便在移动浏览器中使用此类功能。
但是,我无法理解以下MDN文档
Window.console只读属性返回对以下内容的引用: 控制台对象,提供将信息记录到 浏览器的控制台。
(https://developer.mozilla.org/en-US/docs/Web/API/Window/console)
尤其是:
Window
接口的实际情况做正面或反面,但它似乎与全局window
属性不同您不能使用window.console = {...},因为window.console是 只读属性! – Luillyfe 2月23日21:28
Window.console
或window.console
的只读性是什么?
答案 0 :(得分:4)
它不是只读的。 MDN是一个很好的资源,但是它是由社区编辑的,有时会出现错误或无来源的声明。
- 我无法对
Window
界面的实际情况做正面或反面,但它似乎与全局窗口属性不同
接口Window
定义了浏览器中窗口对象上可用的属性和方法,可通过默认的window
全局变量获得这些属性和方法。您可以这样认为:var window = new Window()
当然不是 literally true。
- ...
Window.console
或window.console
的只读性是什么?
它不是只读的。
理论: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(实际上是浏览器环境的“根”对象)。