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

时间:2015-09-21 22:47:51

标签: javascript oop javascript-objects prototypal-inheritance

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

我很好奇如何创建window.console对象,使得函数log认为它的上下文是窗口实例,而不是控制台。这与Object.create new关键字或绑定/自我=这有关吗?

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

windowInstance.console.log = function (args) {

}.bind(windowInstance, args);

差不多,我想象这样的布局,但不明白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
}

由于

1 个答案:

答案 0 :(得分:4)

如果你有:

var obj = { hello: "world" };
console.log(obj);

你会惊讶于控制台显示了这个对象吗?同样的道理,

console.log(this);

记录this的值,因为之外对控制台功能的调用。您无法强制console.log()记录它认为this的值在其自己的参考框架中的内容;在API中没有规定(因为坦率地说它不是很有用)。如果您想记录window.console对象的状态,您可以:

console.log(window.console);