2011-07-25 48 views
6

IE8和toString对象的方法是什么?IE8中的Object.toString问题,backbone.js

我想在我的Backbone.js模型中覆盖toString,但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/

回答

9

如果移动toStringBackbone.Model.extend外:

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

它的工作原理。我会怀疑骨干做一些时髦的东西,如IE8预期

编辑不起作用(感谢@Ferdinand Prantl):

传递到Backbone.extend被添加到模型的prototype所有属性枚举使用for-inIE < 9有一个错误,它不会复制一些名为DontEnumBug的属性。

DontEnumBug

在IE < 9,JScript的将其中 有在对象的原型链一个同名属性, 具有DontEnum属性的任何财产跳过在任何对象。

构造,的toString,的valueOf,的toLocaleString,原型,isPrototypeOf,propertyIsEnumerable,hasOwnProperty,长度和独特的将全部被跳过。

+0

奇怪......我以为我尝试过,但显然不是。谢谢! – Sam

+2

主干通过for-in枚举来覆盖原型的所有属性。 IE跳过名称的属性:构造函数,toString,toLocaleString,valueOf和isPrototypeOf。它被称为[DontEnumBug](https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug)。 –