2011-07-25 18 views
6

Điều gì đang xảy ra với IE8 và phương thức đối tượng toString?Các vấn đề với Object.toString trong IE8, backbone.js

Tôi đang cố gắng ghi đè toString trong các mô hình của mình trong Backbone.js, nhưng IE8 dường như không nhận ra rằng phương thức có ở đó. Thay đổi tên phương thức thành tên khác hoạt động tốt, nhưng tại sao tôi không thể sử dụng toString? Tính năng này hoạt động trong 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" 

đang JSFiddle: http://jsfiddle.net/x96mR/3/

Trả lời

9

Nếu bạn di chuyển toString ngoài Backbone.Model.extend tới:

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

Nó hoạt động. Tôi nghi ngờ Backbone rằng đang làm một số công cụ sôi nổi mà không hoạt động như mong đợi trong IE8

Chỉnh sửa (nhờ @Ferdinand Prantl):

Tất cả các thuộc tính thông qua vào Backbone.extend được thêm vào mô hình của prototype sử dụng số for-in. IE < 9 có một lỗi mà nó sẽ không sao chép các thuộc tính nhất định được gọi là DontEnumBug.

DontEnumBug

Trong IE < 9, JScript sẽ bỏ qua bất cứ tài sản ở bất kỳ đối tượng nơi có một tài sản có cùng tên trong chuỗi nguyên mẫu của đối tượng đó có thuộc tính DontEnum.

constructor, toString, valueOf, toLocaleString, nguyên mẫu, isPrototypeOf, propertyIsEnumerable, hasOwnProperty, chiều dài, và độc đáo tất cả sẽ bị bỏ qua.

+0

Lạ ... Tôi nghĩ tôi đã thử điều đó nhưng dường như không. Cảm ơn! – Sam

+2

Backbone icopies tất cả các thuộc tính từ mẫu thử nghiệm theo kiểu liệt kê. IE bỏ qua các thuộc tính với tên: constructor, toString, toLocaleString, valueOf và isPrototypeOf. Nó được gọi là [DontEnumBug] (https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug). –

Các vấn đề liên quan