【问题标题】:Prototype value not showing up in developer toolbar原型值未显示在开发人员工具栏中
【发布时间】:2018-02-21 05:41:09
【问题描述】:

如果你在 stackoverflow 的代码 sn-p 中运行它,它会同时显示名字和姓氏,但在我的网站上,当使用 Chrome 的开发人员工具栏或 Firefox 时,它只显示 firstName 属性。

    function Person(){
      this.firstName = 'first name goes here';
    }

    var person = new Person();
    Person.prototype.lastName = 'last name goes here';
    console.log(person);

我还怀疑使用“new”关键字不再是最佳做法,但我不记得我可能在哪里读到过。

【问题讨论】:

  • 是的,不同的工具给出不同的输出。这没什么奇怪的。 SO sn-p 覆盖console.log 的默认行为。
  • “我也有一个挥之不去的怀疑,即使用“new”关键字被认为不再是最佳实践,但我不记得我可能在哪里读到过。” 不要让自己被意识形态所迷惑。 new 没有错。
  • @trincot:让它成为答案:)
  • This is basically what new does。在我看来,纯粹主义者认为每次都明确地写出来会更有意义......这取决于你。
  • “lastName”是一个在“Person”类型的所有对象之间具有共享值的属性。这种行为并没有让我感到震惊。

标签: javascript


【解决方案1】:

确实,不同的工具会给出不同的输出。这没什么奇怪的。 SO sn-p 工具覆盖了console.log 的默认行为,创建了一个虚拟控制台。

堆栈片段虚拟控制台的背景

Stack Snippet 启动后,这成为用户社区的变更请求之一:Add a console to Stack Snippets,最终实现:Stack Snippets Upgrade: Virtual Console

这些主题中关于 meta 的讨论说明了为什么这是一个理想的功能,例如:

  • 因为我们还没有打开控制台,所以要意识到没有输出是很多工作。
  • 你看到人们使用document.write,这是一个糟糕的主意。
  • alert() 非常具有侵入性。

这个实现与console.log 在浏览器控制台中产生的完全不同,它本身是模棱两可的:不同的浏览器有不同的控制台行为:对于控制台应该输出什么没有标准。例如,在执行 console.log(new Set([1]).entries()); 时,请注意 FireFox 和 Chrome 之间的许多区别

区别

Stack Snippets 虚拟控制台显示所有可枚举的属性,无论它们是否被继承。这大致对应于:

for (prop in person) {
    console.log(prop, person[prop]);
}

浏览器中的控制台具有更全面的呈现。除了可折叠控件和异步检索之外,它们还可视化不可迭代的属性,例如__proto__。然后在扩展 __proto__ 节点时列出继承的属性。所有这些功能都比轻量级 Stack Snippet 解决方案先进得多。

如果您想知道虚拟控制台输出中包含继承的可枚举属性的确切原因,那么这个问题更适合meta,设计师(@canon 和其他人)可以在其中评论他们的自己做决定。

使用new?

关于new 的使用是否是最佳实践:这主要是基于意见。你可以看看JavaScript: The Good Parts - How to not use new at all:你可以看到投票最多的答案是如何在两者之间摇摆不定的。

【讨论】:

  • 虽然这个答案不太让我满意!
  • 以什么方式?你期待什么?
  • 例如:为什么是“工程师”?决定不这样做???或者为什么会这样!您基本上是在确认这种行为存在!不太满意!
  • 为什么它是按照 Stack Snippet Virtual Console 中的方式完成的,这确实是一个更适合在 meta.stackexchange.com 上提出的问题。查看我的答案的更新。
猜你喜欢
  • 2017-07-30
  • 2020-10-08
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2013-03-08
  • 2015-09-25
相关资源
最近更新 更多