覆盖对象';在javascript中的toString

覆盖对象';在javascript中的toString,javascript,google-chrome,prototypal-inheritance,Javascript,Google Chrome,Prototypal Inheritance,我在玩toString方法,当我试图重写函数的toString方法时,我可以在尝试console.log-ing时看到效果 产生 function greet(){ window.runnerWindow.proxyConsole.log("Hello!"); } Overridden toString [object Object] { fav_food: "Carrots", name: "Ray" } [object Object] { fav_food: "Carrots"

我在玩toString方法,当我试图重写函数的toString方法时,我可以在尝试console.log-ing时看到效果

产生

function greet(){
window.runnerWindow.proxyConsole.log("Hello!");
}
Overridden toString
[object Object] {
  fav_food: "Carrots",
  name: "Ray"
}
[object Object] {
  fav_food: "Carrots",
  name: "Ray",
  toString: function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
}
}
然而,当我尝试用同样的方法处理对象时,它似乎没有起作用

产生

function greet(){
window.runnerWindow.proxyConsole.log("Hello!");
}
Overridden toString
[object Object] {
  fav_food: "Carrots",
  name: "Ray"
}
[object Object] {
  fav_food: "Carrots",
  name: "Ray",
  toString: function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
}
}
我以为第二个console.log会打印出来

My name is Ray and I loooove Carrots
我甚至尝试在Object.prototype中更改toString方法,但仍然没有任何效果。有人能解释一下这段代码的错误吗?

很有趣。在
console.log()
output中对
toString()方法进行Chrome处理

如果你改为提醒(雷)
,你会看到“我的名字叫雷,我喜欢胡萝卜。”

要在控制台中看到相同的内容,请执行以下操作:

console.log(ray.toString());
……或者:

console.log(ray + '');

您可以为此创建一个新的
控制台
功能:

console.say= function(s) {
  console.log(s + '');
}
示例:

console.say=函数{
控制台日志(s+“”);
}
变量射线={
'name':'Ray',
“最喜欢的食物”:“胡萝卜”
};
ray.toString=函数(){
返回“我的名字是”+this.name+“我爱”+this.fav_食物;
};

安慰,说(雷)//我的名字是Ray,我喜欢胡萝卜
谢谢,但是我有点困惑为什么函数不一样?用问候语,当我说console.log(问候)时;toString函数被调用,返回的任何内容都是我们在控制台中看到的。这是一个好问题,为什么它适用于函数而不适用于其他对象。我可以想象Chrome使用了一些内部表示结构。这允许它“浏览”对象并保持精确的对象图视图,即使是在修改原型的情况下。其他浏览器如FF和IE会隐式执行toString,它们需要
console.dir
来获得类似于Chrome的
console.log
中的行为。开发者工具是开发者工具;行为是由实现定义的,观察到的怪癖/差异应该与其他JavaScript行为区别开来。@user2864740,我同意,Chrome这样做可能是件好事。调试时,最好查看实际的数据结构。有趣的是,Chrome并没有将这种行为应用到函数中。@user2864740,我在Chrome中看到,您的示例确实会导致“hi!”!