【问题标题】:Can window.console be overwritten? Is it read-only?window.console 可以被覆盖吗?它是只读的吗?
【发布时间】:2018-12-07 09:42:29
【问题描述】:

我在 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 的只读属性是什么?

【问题讨论】:

  • 对于任何关注上面的 MDN 链接但没有看到“只读”的人:当humanandpeace 发布问题时,它就在那里。我更新了 MDN 页面,请参阅下面的答案了解原因。

标签: javascript browser


【解决方案1】:

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

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

接口Window定义了浏览器中window对象可用的属性和方法,可以通过默认的window全局变量获得。你可以把它想象成这样:var window = new Window() 虽然这当然不是字面意思真的。

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

它不是只读的。

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

  • 实践:它可以在我尝试过的所有浏览器(Chrome、Firefox、Safari、IE9、IE11、Edge)上写入。在除 IE11 之外的所有这些中,consolewindow 所指对象的“自己的”属性,并且分配给它可以工作(在松散和严格模式下)。 (IE11 是奇怪的鸭子:console 在 devtools 关闭时不是 window 的自己的属性,但它的类型是 "object",如果你登录 String(console) 结果是 "[object Console]"。但是当 devtools 是打开,它是window 自己的属性,不是只读的。)

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

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

【讨论】:

  • 谢谢,感谢您提供的信息(包括在 6 个用户代理中进行了测试)。我将不得不更多地阅读提供的规范,以找出 Window interface 在属性上下文中的真正含义。所以只是为了确定你建议 MDN 中关于 Window.console 是属性的信息不正确,或者只是它是只读的?
  • @humanityANDpeace - 我已经更新了答案以尝试对windowWindow 有所帮助。我还修复了 MDN 页面。我希望其余的大部分(或全部)都很好,只是似乎有人做了一个假设,在编写/编辑它时似乎并不正确。
  • 控制台规范将 console 定义为标识 WebIDL namespace object 的属性,我看到 WebIDL 规范说 “该属性具有属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }。”——所以我认为这意味着console被正式/规范地定义为可写的。
  • @sideshowbarker - 谢谢。我想知道是否有关于命名空间对象的定义。我已经更新了答案以将其折叠起来,但是如果您更愿意发布自己的答案,请告诉我,我将进行编辑以仅参考您的答案。不错!
【解决方案2】:

Window 是用 JS 引擎的原生代码编写的接口(类似于 V8 中的 C++)。它是 window 全局变量的原型,它将这个接口暴露给 JavaScript。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多