2013-02-26 3 views
0

В следующем коде,Javascript вызова функции() этот контекст

var toString = Object.prototype.toString; 

toString.call(new Date); // [object Date] 
toString.call(new String); // [object String] 
toString.call(Math); // [object Math] 

в вызове текущий объект передается как (toString.call(new Date)), но в receving конце var toString = Object.prototype.toString; здесь вместо использования this ключевого слова они используют Object ключевое слово, но все равно получил правильный ответ. Я не понял эту концепцию. Любой мне помог в понимании этой концепции.

+0

Вы говорите, что приведенные выше примеры * работают * или * не работают? –

ответ

3

.call выполняет функцию с предоставленным контекстом. var toString = Object.prototype.toString передает функцию ObjecttoString переменной. Предполагаю, что для легкого доступа.

Затем вы можете использовать toString.call([new context here]) для вызова метода Object toString с предоставленным контекстом. Как вы можете видеть, это печатает [object OBJECTNAME] в виде строки.

ObjecttoString отличается от других. Например:

(new Date).toString(); // "Tue Feb 26 2013 01:00:17 GMT-0500 (EST)" 
(new String).toString(); // '' 
1

Я не уверен, что я понимаю ваш вопрос. Но здесь идет.

var toString = Object.prototype.toString;

В этой строке вы читаете «прототип» свойство объекта и чтения свойства «ToString» прототипа. Свойство toString является функцией. Вы сохранили это в своей переменной.

Теперь, когда вы делаете это: toString.call(new Date);, вы берете эту функцию сверху и собираются применить его на объект, возвращаемый «новой дате» (т.е. this контекст для кода в ToString становится объект, возвращаемый «новой дате ")

Вы можете думать об этом как о копировании метода, принадлежащего объекту, и его применении на другом объекте.

1

Прежде всего вам нужно понять, как изменяется значение 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/

Смежные вопросы