为什么 `window.console.log(this)` 不记录控制台对象?

nea*_*sic 1 javascript oop prototypal-inheritance javascript-objects

我刚刚进入高级上下文实例化,使用原型链等。

我很好奇该window.console对象是如何创建的,以便该函数log认为它的上下文是窗口实例,而不是控制台。Object.create这与关键字有关new,还是与 binding / self = this 有关?

window.console有一个构造函数(控制台),我很好奇调用构造函数、传递 Window 实例/上下文的最干净的方法是什么?将其作为参数传递?如果 Console 是一个单独的构造函数,我认为 Window 将是使用新上下文构造它的构造函数,而不是说

windowInstance.console.log = function (args) {

}.bind(windowInstance, args);
Run Code Online (Sandbox Code Playgroud)

几乎,我正在想象这样的布局,但不明白如何this路由

var window = new Window();
window.console.log(this); // logs window

function Window () {
    // this === window when constructed above
    this.console = new Console();
}

function Console () {
    this.log = function () {} // where this === window.console but log thinks it's window
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Poi*_*nty 5

如果你有:

var obj = { hello: "world" };
console.log(obj);
Run Code Online (Sandbox Code Playgroud)

当控制台显示该对象时,您会感到惊讶吗?出于同样的原因,

console.log(this);
Run Code Online (Sandbox Code Playgroud)

记录控制台函数调用this之外值。你不能强迫记录它认为在它自己的参考框架中console.log()的值;thisAPI 中没有对此进行规定(因为坦率地说,它不是很有用)。如果您想记录对象的状态,window.console您可以:

console.log(window.console);
Run Code Online (Sandbox Code Playgroud)