Проблемы с Object.toString в IE8, backbone.js - PullRequest
6 голосов
/ 25 июля 2011

Что случилось с IE8 и toString методом Objects?

Я пытаюсь переопределить toString в моих моделях в Backbone.js, но IE8, похоже, не распознает, что метод есть. Изменение имени метода на другое работает нормально, но почему я не могу использовать toString? Это работает в 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"

JSFiddle код: http://jsfiddle.net/x96mR/3/

1 Ответ

9 голосов
/ 26 июля 2011

Если вы переместите toString за пределы Backbone.Model.extend на:

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

Это работает. Я подозреваю, что Backbone делает некоторые интересные вещи, которые не работают так, как ожидалось в IE8

Редактировать (спасибо @Ferdinand Prantl):

Все свойства, переданные в Backbone.extend, добавляются в prototype модели с использованием перечисления for-in. IE < 9 имеет ошибку, из-за которой не копируются определенные свойства, называемые DontEnumBug.

DontEnumBug

В IE <9 JScript пропустит любое свойство в любом объекте, где в цепочке прототипов объекта есть одноименное свойство, которое имеет атрибут DontEnum. </p>

конструктор, toString , valueOf, toLocaleString, prototype, isPrototypeOf, propertyIsEnumerable, hasOwnProperty, length и unique будут пропущены

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...