<script type="text/javascript">
    
      function StringBuffer() {
        this.bb = [];
      }
      
      StringBuffer.prototype.append = function(str) {
        this.bb.push(str);
      }
      
      StringBuffer.prototype.toString = function() {
        return this.bb;
      }
      
      var sb = new StringBuffer();
      
      sb.append("abcd");
      
      document.write(sb);
    </script>小弟写了个字符串连接的类,在toString方法 里返回this.bb;为啥返回给我的是undefined呢,而不是数组里的内容呢?

解决方案 »

  1.   

    如果这样写就好用document.write(sb.toString());  为什么呢,输出对象时,它不是默认调用toString方法 吗。
      

  2.   

    此toString()非彼toString(),前者是你自定义的,只不过你非要将StringBuffer的这个原型取名为toString()而已。
    实际上你可以随便定义什么:
     StringBuffer.prototype.toString = function() {
            return this.bb;
          }
         ---------------》
     StringBuffer.prototype.abcde= function() {
            return this.bb;
          }
    ....
     document.write(sb.abcde());
      

  3.   

    它确实调用了toString()函数,可惜document.write()函数只支持string的参数!
    你的bb里的字符串要拼接成string的大哥!!
      

  4.   

    默认调用是对toString函数的代理。你可以先理解下设计模式中的代理模式
    代理流程为:
    1.得到对象
    2.判断对象不为String,调用对象的toString方法
    3.如果2的返回值不为String,则返回undefined。如果你直接调用toString,就不会有这个代理的过程。ps. js中代理模式得到广泛应用。比如关键字new也是代理的。
    详细可以参考我的博客
    http://www.iteye.com/topic/1038974
      

  5.   


    你也看到了 函数名称是 toString 意思是返回字符串嚒 那你干嘛返回一个 Array呢?
     StringBuffer.prototype.toString = function() {
            return this.bb.toString();
          }
    这样写就不会产生歧义了
      

  6.   

    document.write(sb)
    会自动调用 sb 的 toString 方法但只有当 typeof sb.toString() === "string"  时,才会使用 sb.toString() 的返回值它没有尝试去调用 sb.toString().toString()所以你应该修改你的代码StringBuffer.prototype.toString = function() {
    // return this.bb.toString()
    return this.bb.join("");
    };