0
function Cons()
    {
        this.a = "variable a";
        this.callme = function callme()
        {
            var str = "";
                for(var x in this)
                {
                    str += this[x] + " ";
                }
            return str;
        }
    }

    var obj = new Cons();

    obj.c = "variable 2";

    var fin = obj.callme();
    document.write(fin);

我想在对象内部有一个函数,以便在调用它时可以返回一个由每个成员的值组成的字符串。在这种情况下ac。现在会发生什么,函数内部的所有内容我的意思是代码都打印在浏览器中,而不是仅仅返回str.

我的理解是 for-in 循环中的 this["callme"] 部分返回整个代码作为它也是一个变量。那么如何解决这个问题。

我是 javascript 新手,请帮助我。

4

2 回答 2

2

有几种方法可以解决这个问题:

1)从 for..in 中删除 callme :

for(var x in this) {
  if (x !== 'callme') {
    str += this[x] + " ";
  }
}

2) 将 callme 声明为不可枚举的属性:

function Cons() {
    Object.defineProperty('callme', {
      enumerable : false,
      value : function callme() {
        var str = "";
            for(var x in this)
            {
                str += this[x] + " ";
            }
        return str;
      }
    });
}

3) 更改 callme 的 toString 方法不返回任何内容:

function Cons() {
    this.a = "variable a";
    this.callme = function callme() {
        var str = "";
            for(var x in this)
            {
                str += this[x] + " ";
            }
        return str;
    }
    this.callme.toString = function(){ return '';};
}

最简单的解决方案是第一个,但其他的太有趣了,无法通过。

于 2013-11-12T17:44:37.073 回答
1

如果要避免打印函数体,请检查属性是否为函数并仅打印其名称:

this.callme = function callme()
    {
        var str = "";
            for(var x in this)
            {
                if ('function' === typeof this[x]) {
                    str += x + " ";
                } else {
                    str += this[x] + " ";
                }
            }
        return str;
    }
于 2013-11-12T17:43:18.513 回答