Использование цикла for-in внутри объекта для доступа к его элементу

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);

Я хочу, чтобы внутри объекта была функция, чтобы при ее вызове она могла возвращать строку, состоящую из значений каждого члена. Вот в этом случае a а также c, Теперь, что происходит, все внутри функции, я имею в виду, код печатается внутри браузера, а не просто возвращает значение str,

Я понял, что эта ["callme"] часть цикла for-in возвращает весь код в качестве его переменной. Так как решить эту проблему.

Я новичок в JavaScript, пожалуйста, помогите мне.

2 ответа

Решение

Если вы хотите избежать печати тела функции, проверьте, является ли свойство функцией, и напечатайте только ее имя:

this.callme = function callme()
    {
        var str = "";
            for(var x in this)
            {
                if ('function' === typeof this[x]) {
                    str += x + " ";
                } else {
                    str += this[x] + " ";
                }
            }
        return str;
    }

Есть несколько способов решить эту проблему:

1) Удалить callme из for..in:

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) Измените метод toString в callme, чтобы он ничего не возвращал:

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 '';};
}

Самое простое решение - первое, но другие слишком интересны, чтобы их пропустить.

Другие вопросы по тегам