在javascript中覆盖对象的toString

时间:2015-05-05 19:06:14

标签: javascript google-chrome prototypal-inheritance

我正在使用toString方法,当我尝试覆盖函数的toString方法时,我可以看到当我尝试console.log-ging时的效果。 http://jsbin.com/bigocijuqo/1/edit?js,console

function greet(){
  console.log("Hello!");
}
console.log(greet);

greet.toString = function () {
   return "Overridden toString";
};
console.log(greet);

产生

function greet(){
window.runnerWindow.proxyConsole.log("Hello!");
}
Overridden toString

然而,当我尝试对象时,它似乎并没有生效。 http://jsbin.com/jebunakibi/1/edit?js,console

var ray = {
  'name': 'Ray',
  'fav_food': 'Carrots'
};

console.log(ray);

ray.toString = function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
};

console.log(ray);

产生

[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方法,但它仍然没有产生任何影响。有人可以解释这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

有趣。 Chrome ignores toString()输出console.log()方法。

如果你改为alert(ray),你会看到“我的名字是Ray,而我是loooove Carrots。”

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

console.log(ray.toString());

......或者这个:

console.log(ray + '');

您可以为此目的创建一个新的console函数:

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

示例:

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

var ray = {
  'name': 'Ray',
  'fav_food': 'Carrots'
};

ray.toString = function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
};

console.say(ray); //My name is Ray and I loooove Carrots