在面试中,我被问到任何字符串,例如当执行下面的代码行时,应该控制"Hello".
console.log(new X())
这应该在不需要任何额外的console.log语句的情况下实现.
我try 了一些类似的方法:
function X() { return "Hello"; }
但它没有返回字符串.它返回新创建的X的实例.
这是刁钻的问题吗?
在面试中,我被问到任何字符串,例如当执行下面的代码行时,应该控制"Hello".
console.log(new X())
这应该在不需要任何额外的console.log语句的情况下实现.
我try 了一些类似的方法:
function X() { return "Hello"; }
但它没有返回字符串.它返回新创建的X的实例.
这是刁钻的问题吗?
TL;DR;
function X() {
return document.createTextNode("Hello");
}
console.log(new X()); //"Hello"
解释:
一个直接的 idea 是以某种方式使用toString
,但它不起作用.记录实现toString
的普通对象或类时,当您记录它时仍会输出对象 struct ,因此这将不起作用.
规范的两个部分是解决这个问题的关键:
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new)
当使用new关键字调用函数时,该函数将用作构造函数.New将执行以下操作:
...
- 如果构造函数返回非原语,则此返回值将成为整个新表达式的结果.否则,如果构造函数不返回任何内容或返回原语,则返回
newInstance
.
您几乎无法控制如何记录用户定义的类.但是可能有一个内置的对象将记录文本,所以我们需要计算出that可能是多少,然后在构造函数中返回它.什么内置对象记录文本?
(https://console.spec.whatwg.org/)
§1.1.6.日志(log)(...日期)
执行Logger("log",data).
§2.1.记录器(logLevel,args)
记录器操作接受日志(log)级别和其他参数列表.它的主要yields 是implementation-defined side effect of printing the result to the console.
第2.3节.打印机(logLevel,args[,options])
打印机操作由实现定义.它接受指示严重性的日志(log)级别,要打印的参数列表...出现在ARG中的元素将是以下内容之一:
- 任何类型的JavaScript对象.
- 特定于实现的可打印内容的表示形式,如堆栈跟踪或组.
- 应用了通用JavaScript对象格式或optimally useful formatting的对象.
§2.3.3.常见对象格式
通常情况下,对象将以适合其上下文的格式打印...具有通用JavaScript对象格式的对象是通用JavaScript对象的潜在可扩展表示形式.An object with optimally useful formatting is an implementation-specific, potentially-interactive representation of an object judged to be maximally useful and informative.个
^^泥土.我们需要找到一个具有"最佳有用格式"的对象,而不是对象树.我找不到一个详尽的 list ,但让我们考虑一下.我马上就知道,记录DOM node 会记录html树,而不是对象树:
因此,我跳过一步,猜测记录文本 node 可能只是记录文本,并且它是有效的:
那里它是
function X() {
return document.createTextNode("Hello");
}
console.log(new X()); //"Hello"
class X {
constructor() {
return document.createTextNode("Hello");
}
}
console.log(new X()); // "Hello"
另请参阅: