Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

toString does not work in IE

I have a class in javascript which define the toString method,however when I want to print it in the page,it always print [object object] in IE(6-8).

But it works in firefox or chrome(they all print 'kk' in the example below).

I wonder why?

This is the example code:

function Person(name){
  this.name=name;
}
Person.prototype.toString=function(){
  return this.name;
}
var p=new Person('kk');
document.getElementById('dis').innerHTML=p.toString();

What is the problem?


BTW,this is the code in my application:

function inherit(pro) {
    function F() {};
    F.prototype = pro;
    return new F();
}
var Class = function() {
    var clazz = null,
    pros = {}; // root of chain
    for (var i = 0; i < arguments.length; i++) {
        var arg = arguments[i];

        if (typeof arg === "function") {
            arg = arg.prototype;
        } else {
            if (arg.init) {
                clazz = arg.init;
                delete arg.init;
            }
            var o = arg;
            arg = (function() {
                function F() {};
                F.prototype = pros;
                return new F;
            })();
            for (var key in o) arg[key] = o[key];
        }

        pros = arg;
    }

    clazz.prototype = pros;
    return clazz;
};

var Person = Class({
    init: function(name) {
        this.name = name;
    },
    toString: function() {
        return this.name;
    }
});

function init() {
    var p = new Person('kk');
    document.getElementById('dis').innerHTML = p.toString();
}
window.onload = init;

Screen shot:

IE

Firefox

like image 221
hguser Avatar asked Feb 22 '23 07:02

hguser


1 Answers

Actually the comments above are not correct. Although you may not be able to override default prototype methods on elements, you CAN do it for your own types. The problem is that toString is not returned as a key in the code snippet:

for (var key in o) arg[key] = o[key];

if you add the following, things will work as expected:

if (o.toString !== Object.prototype.toString) {
   arg.toString = o.toString
}
like image 72
Jason Young Avatar answered Mar 01 '23 23:03

Jason Young