2011-07-25 6 views
6

ऑब्जेक्ट्स की IE8 और toString विधि के साथ क्या हो रहा है?IE8 में Object.toString के साथ समस्याएं, backbone.js

मैं Backbone.js में अपने मॉडल में toString को ओवरराइड करने का प्रयास कर रहा हूं, लेकिन IE8 यह नहीं मानता कि विधि वहां है। विधि नाम को किसी अन्य चीज़ में बदलना ठीक काम करता है, लेकिन मैं toString का उपयोग क्यों नहीं कर सकता? यह क्रोम में काम करता है।

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.extend बाहर toString ले जाते हैं:

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

यह काम करता है। मुझे लगता है यह होगा कि रीढ़ कुछ अजीब सामान कि IE8 में अपेक्षा के अनुरूप

संपादित काम नहीं करता है क्या कर रहा है (धन्यवाद Prantl @Ferdinand के लिए):

सभी गुण Backbone.extend में पारित कर दिया मॉडल के prototype से जुड़ जाते हैं for-in गणना का उपयोग कर। IE < 9 में एक बग है जहां यह DontEnumBug नामक कुछ गुणों की प्रतिलिपि नहीं करेगा।

DontEnumBug

आईई < 9 में, JScript किसी भी वस्तु में किसी भी संपत्ति पर छोड़ देगा जहां वहाँ वस्तु के प्रोटोटाइप श्रृंखला में एक समान नाम वाले संपत्ति DontEnum विशेषता है कि है।

निर्माता, toString, valueOf, toLocaleString, प्रोटोटाइप, isPrototypeOf, propertyIsEnumerable, hasOwnProperty, लंबाई, और अद्वितीय सब छोड़ दिया जाएगा।

+0

अजीब ... मैंने सोचा कि मैंने कोशिश की लेकिन स्पष्ट रूप से नहीं। धन्यवाद! – Sam

+2

बैकबोन प्रोटोटाइप से सभी गुणों को इन-इन गणना द्वारा icopies। आईई नामों के साथ संपत्तियों को छोड़ देता है: कन्स्ट्रक्टर, टूस्ट्रिंग, toLocaleString, valueOf और isPrototypeOf। इसे [डोंटएनमबग] कहा जाता है (https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug)। –