2011-07-25 10 views
6

オブジェクトのIE8およびtoStringメソッドは何ですか?IE8、backbone.jsでObject.toStringに関する問題

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

あなたにBackbone.Model.extendtoStringを移動した場合:

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

それは動作します。 Backbone.extendに渡されるすべてのプロパティがモデルのprototypeに追加され

:私は、そのバックボーンがIE8

編集(おかげでPrantlを@Ferdinandする)で期待どおりに動作しないいくつかのファンキーなものをやっている疑いがあるでしょうfor-in列挙を使用します。 IE < 9には、DontEnumBugという特定のプロパティをコピーしないバグがあります。 IE < 9で

DontEnumBug

、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)と呼ばれています。 –