Прежде всего вам нужно понять, как изменяется значение this
в зависимости от того, как вызывается функция.
Прежде всего, у нас есть функции-члены. Object.prototype.toString
является функцией-членом от Object.prototype
. Можно представить себе это просто как:
Object.prototype = {
toString: function() {} // is responsible for converting an object to it's string representation
};
Когда функция вызывается элемент, контекст this
относится к родительскому объекту (экземпляру Object
). Как встроенные объекты JS расширить Object
, все они могут использовать .toString()
с разными результатами:
(new Object).toString(); // [object Object]
(new String).toString(); // [object String]
Это помогает представить внутреннюю работу .toString()
, вы бы себе представить, что могли бы сделать что-то вроде:
// ..
return '[object '+ this.constructor.name + ']';
// ..
Надеюсь, теперь вы можете представить себе, как изменение значения this
в функции изменит проверяемый объект.
Когда вы вызываете Object.prototype.toString
через.вызов(), вы можете передать новое значение, которое будет использоваться в качестве this
:
Object.prototype.toString.call(new Date); // [object Date]
Я настоятельно рекомендую прочитать Иегуда Katz»простое объяснение 3 способа повлиять на стоимость this
при вызове функции:
http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/
Вы говорите, что приведенные выше примеры * работают * или * не работают? –