【问题标题】:toString does not work in IEtoString 在 IE 中不起作用
【发布时间】:2012-02-27 13:54:42
【问题描述】:

我在 javascript 中有一个定义 toString 方法的类,但是当我想在页面中打印它时,它总是在 IE(6-8) 中打印[object object]

但它可以在 firefox 或 chrome 中使用(在下面的示例中它们都打印 'kk')。

不知道为什么?

这是示例代码:

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

有什么问题?


顺便说一句,这是我应用程序中的代码:

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;

屏幕截图:

【问题讨论】:

  • it works 是什么意思?它在 FF 和 Chrome 中有什么作用?
  • 代码的最后一行,即window.onload = init();,不正确/不是您期望的那样。这将立即执行init 函数,而不是在加载窗口时。删除 () 括号是正确的。
  • 很好,但结果没有改变。
  • 刚刚尝试了最后一段代码。它在 IE9 中工作,但它确实在 IEtester 中显示 [object Object] for IE8 及以下。从截图来看,我认为他正在使用 IE8。

标签: javascript internet-explorer tostring


【解决方案1】:

其实上面的cmets是不正确的。尽管您可能无法覆盖元素上的默认原型方法,但您可以为自己的类型执行此操作。问题是在代码sn-p中toString没有作为key返回:

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

如果您添加以下内容,事情将按预期进行:

if (o.toString !== Object.prototype.toString) {
   arg.toString = o.toString
}

【讨论】:

    【解决方案2】:

    好的,我现在看到你的问题了。

    所有旧版 IE(9 之前)中,javascript 引擎不允许让您修改元素的原型函数。

    所以一个对象的默认toString()[object Object]

    对于旧版本的 IE,您可能需要为代码考虑不同的方法。

    在此处查看文章:http://blog.motane.lu/2007/09/20/elementprototype-in-ie/


    来自 cmets 的最终回答如下:

    .toString已经所有对象原型中的预定义函数,在IE中不能被覆盖。尝试使用不同的函数名称。

    【讨论】:

    • 现在我们相信你的截图:-)
    • @Neal:我也上传了我的截图。 :(
    • @hguser 你用的是什么版本的IE?
    • @Neal:我在 IE(6-8) 中测试它。现在,你应该相信我。 :)
    • @hguser .toString已经所有对象原型中的预定义函数,在IE中不能被覆盖。尝试使用不同的函数名称。
    【解决方案3】:

    其实你可以!你只需要把 toString 移到外面

    Person.prototype.toString = function() { return this.name; }
    

    更多信息请查看此其他帖子

    Issues with Object.toString in IE8, backbone.js

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2011-07-31
      • 2012-05-16
      相关资源
      最近更新 更多