2013-10-15 5 views
1

Вот что я нашел в какой-то код, который я читал, когда я тестировал в консоли:Почему Object.prototype.toString.call() дает отличный результат, чем Object.prototype.toString()?

 
Object.prototype.toString("foo"); // output: "[object Object]" 

Object.prototype.toString.call("foo"); // output: "[object String]" 

Я думаю, что может иметь слабое представление, но я не могу выразить словами ... может кто-нибудь объяснить?

+1

Прочитайте документацию для [ 'метод call'] (https://developer.mozilla.org/en -US/документы/Web/JavaScript/Справочник/Global_Objects/Функция/вызов). Выход отличается от того, что вы делаете радикально разные вызовы. ['toString'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) не принимает параметр. – Bergi

ответ

4

Две звонки НЕ эквивалентны.

Первый вызов:

Object.prototype.toString("foo"); 

вызывает метод toString в контексте Object.prototype, с дополнительным "foo" параметра (неиспользованного) и Object.prototype является Object, так что результат [object Object]

второй звонок:

Object.prototype.toString.call("foo"); 

звонит toString метод в контексте "foo" и Object.prototype.toString строит объект из него (new String("foo")), так что результат [object String]

+0

На самом деле '' foo "' является примитивным значением, только когда [casted to a object] (http://es5.github.io/#x15.2.4.2) становится экземпляром 'String'. – Bergi

+0

Как бы вы предложили мне это изменить? Сейчас я немного не уверен. –

+0

Хорошо, когда я вызываю '' foo '.toString() ', amd Я снова вызываю его в контексте« foo »? Почему в этом случае выход отличается ('' foo '')? –

0

Первый параметр call является объектом, который будет this внутри функции, а не первый параметр функции:

"use strict"; 
function test(a,b) { 
    console.log(this, a, b); 
}; 
var obj = { 
    'func' : test 
} 
test(1,2) // outputs undefined 1 2 
test.call(1,2); // outputs 1 2 undefined 
obj.func(1,2) // outputs obj 1 2 
obj.func.call(1,2) // outputs 1 2 undefined 
Смежные вопросы