2011-07-25 2 views
6

Co się dzieje z IE8 i metodą obiektów toString?Problemy z Object.toString w IE8, backbone.js

Próbuję przesłonić toString w moich modelach w Backbone.js, ale IE8 wydaje się nie rozpoznać, że metoda istnieje. Zmiana nazwy metody na coś innego działa dobrze, ale dlaczego nie mogę użyć toString? To działa w Chrome.

var Foo = Backbone.Model.extend({ 
    toString: function(){ return this.get("name"); }, 
    description: function(){ return this.get("name"); } 
}); 

var f = new Foo({name: "a foo"}); 

document.writeln(f.toString()); // "[object Object]", should be "a foo" 
document.writeln("<br/>"); 
document.writeln(f.description()); // "a foo" 

kod JSFiddle: http://jsfiddle.net/x96mR/3/

Odpowiedz

9

Jeśli przesuniesz toString poza Backbone.Model.extend do:

Foo.prototype.toString = function(){ return this.get("name"); };

To działa. Podejrzewam, że Backbone robi jakiś ostry rzeczy, które nie działają zgodnie z oczekiwaniami w IE8

Edycja (dzięki @Ferdinand Prantl):

wszystkich właściwości przekazywane do Backbone.extend są dodawane do modelu na prototype przy użyciu wyliczenia for-in. IE < 9 ma błąd, który nie skopiuje niektórych właściwości o nazwie DontEnumBug.

DontEnumBug

< w IE 9, JScript będzie przeskoczyć każdą nieruchomość w każdym obiekcie, gdzie jest nieruchomość o tej samej nazwie w łańcuchu prototypów obiektu, który posiada atrybut DontEnum.

konstruktor, toString, valueOf, toLocaleString, prototyp, isPrototypeOf, propertyIsEnumerable, hasOwnProperty, długość i niepowtarzalny wszystko będzie pominięty.

+0

Dziwne ... Pomyślałem, że próbowałem, ale najwyraźniej nie. Dzięki! – Sam

+2

Szkielet icopies wszystkie właściwości z prototypu według wyliczenia for-in. IE pomija właściwości z nazwami: konstruktor, toString, toLocaleString, valueOf i isPrototypeOf. Nazywa się [DontEnumBug] (https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug). –