2016-11-12 2 views
0

Chrome 54.0.2840.71 (64-разрядная версия)массив console.log не использует пользовательский класс ToString

У меня есть массив объектов, построенных из пользовательского класса. Если I console.log массив, как мне получить объекты в массиве, чтобы использовать их функцию toString без необходимости вручную петли массива? Это возможно?

Кодjsfiddle

function MyClass(value) { 
    MyClass.prototype.getValue = function() { 
    return value; 
    } 
} 
MyClass.prototype.toString = function() { 
    return "[MyClass: " + this.getValue() + "]"; 
} 

var mc0 = new MyClass(0); 
var mc1 = new MyClass(1); 
console.log([mc0, mc1]); 

Выходной ток

[MyClass, MyClass] 

Желаемая Выход

[[MyClass: 0], [MyClass: 1]] 
+0

Это 2016. Используйте ES6. –

+2

Не модифицируйте прототип в конструкторе! 'mc0.toString() ===" [MyClass: 1] "' потому что вы перезаписали его – Oriol

+0

Возможный дубликат [Почему консоль не использует метод toString для введенного объекта?] (http://stackoverflow.com/ q/12254038/1529630) – Oriol

ответ

0

console.log не показывает строковое представление объекта, а представляет собой дерево, представляющее его нотацию JSON. Если вы хотите, чтобы представление строки не имело значения, передайте ей строку.

function MyClass(value) { 
 
    this.getValue = function() { // As a side note, don't overwrite the prototype in constructor 
 
    return value; 
 
    } 
 
} 
 
MyClass.prototype.toString = function() { 
 
    return "[MyClass: " + this.getValue() + "]"; 
 
} 
 

 
var mc0 = new MyClass(0); 
 
var mc1 = new MyClass(1); 
 
console.log([mc0, mc1].toString()); 
 
// OR 
 
console.log("%s",[mc0, mc1]);

Кроме того, что это не единственная вещь, console.log делает. Он также выполняет специальное обращение к некоторым объектам, таким как элементы DOM. См. MDN page.