Когда это безопасно использовать .toString ()? - PullRequest
1 голос
/ 26 июня 2009

Не должно ли значение возвращать toString (), чтобы иметь возможность вызывать value.toString ()? Когда вы знаете, что можете вызвать value.toString ()?

<script>
var newList = function(val, lst)
{
  return {
    value: val,
    tail:  lst,
    toString: function() 
    {
      var result = this.value.toString();
      if (this.tail != null)
        result += "; " + this.tail.toString();
      return result;
    },
    append: function(val)
    {
      if (this.tail == null)
        this.tail = newList(val, null);
      else
        this.tail.append(val);
    }
  };
}

var list = newList("abc", null); // a string
list.append(3.14); // a floating-point number
list.append([1, 2, 3]); // an array
document.write(list.toString());
</script>

Ответы [ 4 ]

5 голосов
/ 27 июня 2009

Как Мр. Блестящие и новые состояния, все объекты JavaScript имеют метод toString. Однако этот метод не всегда полезен, особенно для пользовательских классов и литералов объектов, которые, как правило, возвращают строки типа "[Object object]".

Вы можете создать свои собственные toString методы, добавив функцию с таким именем в прототип вашего класса, например:

function List(val, list) {
    this.val = val;
    this.list = list;

    // ...
}

List.prototype = {
    toString: function() {
        return "newList(" + this.val + ", " + this.list + ")";
    }
};

Теперь, если вы создаете new List(...) и вызываете его метод toString (или запускаете его через любую функцию или оператор, который неявно преобразует его в строку), будет использоваться ваш пользовательский метод toString.

Наконец, чтобы определить, есть ли у объекта метод toString, определенный для его класса (обратите внимание, что не будет работать с подклассами или литералами объектов; это оставлено в качестве упражнения для читателя), вы можете получить доступ к его constructor 's prototype свойству:

if (value.constructor.prototype.hasOwnProperty("toString")) {
    alert("Value has a custom toString!");
}
4 голосов
/ 27 июня 2009
0 голосов
/ 30 июня 2009

Другие ответы верны, что toString существует для всех объектов Javascript.

В общем, однако, если вы хотите узнать, существует ли функция на вашем объекте, вы можете проверить это следующим образом:

if (obj.myMethod) {
    obj.myMethod();
}

Это, конечно, не гарантирует, что myMethod является функцией, а не свойством. Но, вероятно, вы это знаете.

0 голосов
/ 27 июня 2009

document.write, как и window.alert, вызывает метод toString своего аргумента перед тем, как что-либо записать или вернуть.

...