2015-05-05 37 views
3

我在玩toString方法,當我嘗試重寫函數的toString方法時,我可以看到效果,當我嘗試console.log時。 http://jsbin.com/bigocijuqo/1/edit?js,consoleJavaScript中重寫對象的toString

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

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

產生

​​

然而,當我試圖用的對象一樣,它似乎並沒有服用效果。 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 

我甚至試圖改變toString方法在Object.prototype中,但它仍然沒有采取任何影響。有人可以解釋這段代碼有什麼問題嗎?

回答

1

有趣。 Chrome ignorestoString()方法console.log()輸出。

如果您改爲使用alert(ray),您會看到「我的名字是雷,我愛胡蘿蔔。」

要在控制檯中看到同樣的事情,這樣做:

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

+0

不過,我有點困惑,爲什麼它的功能不一樣?問候,當我說console.log(問候); toString函數被調用,返回的是我們在控制檯中看到的。 –

+0

現在這是一個很好的問題,爲什麼它適用於函數而不是其他對象。 –

+1

我會想象Chrome使用一些*內部*表示構造。這允許它「瀏覽」對象並保持準確的對象圖視圖,即使是在修改過的原型的情況下。其他瀏覽器如FF和IE將隱含執行一個toString,並且它們需要'console.dir'來獲得類似於Chrome的'console.log'中的行爲。開發者工具是開發者工具;行爲是實現定義的,並且怪癖/觀察到的差異應該從其他JavaScript行爲中排除。 – user2864740

相關問題