【问题标题】:Where toString fails to work?toString 在哪里无法工作?
【发布时间】:2010-01-13 06:50:45
【问题描述】:
function dTree() {
    return {
        init : function(data) {
            this.data = data;
        },
        node : function(i){
            return '' + i;
        }
    }
};
dTree.prototype.toString = function() {
    var str = '';
    for(var i = 0; i < this.data.length; i++)
    {
        str += this.node(this.data[i]);
    };
    return str;
}
dTree1 = new dTree();
dTree1.init([1,2,3]);
alert(dTree1+'')

我期待它输出123

如何正确地做到这一点?

【问题讨论】:

    标签: javascript tostring


    【解决方案1】:

    这不是你制作构造函数的方式。构造函数不返回任何东西,它们操纵this 对象:

    function dTree() {
        this.init = function(data) {
            this.data = data;
        };
        this.node = function(i){
            return '' + i;
        };
    }
    

    您也可以将toString 的定义粘贴到构造函数中,除非您对它做一些特殊的事情:

    function dTree() {
        this.init = function(data) {
            this.data = data;
        };
        this.node = function(i) {
            return '' + i;
        };
        this.toString = function() {
            var str = '';
            for(var i = 0; i < this.data.length; i++)
            {
                str += this.node(this.data[i]);
            };
            return str;
        };
    }
    

    【讨论】:

    • 为什么不将其他两个函数也移到原型中,而不是将toString 移到构造函数中?在构造函数中声明函数不会为每个实例或那个方向的东西创建一个副本吗?
    • @Bart:我只是在演示构造函数在 JavaScript 中的工作方式。在实践中,当然,您可能希望将方法放在 prototype 对象上。
    【解决方案2】:

    您正在从构造函数返回一个普通的新对象,构造函数中的 this 对象根本没有使用,并且该对象是分配了正确原型对象的对象。

    function dTree() {
      this.init = function(data) {
        this.data = data;
      };
      this.node = function(i){
        return '' + i;
      };
    }
    
    dTree.prototype.toString = function() {
      var str = '';
      for(var i = 0; i < this.data.length; i++)    {
          str += this.node(this.data[i]);
      };
      return str;
    };
    
    dTree1 = new dTree();
    dTree1.init([1,2,3]);
    alert(dTree1 + '');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2018-09-25
      • 2012-01-05
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多