Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятное поведение метода при добавлении во встроенный прототип (https://javascript.ru/forum/misc/47462-neponyatnoe-povedenie-metoda-pri-dobavlenii-vo-vstroennyjj-prototip.html)

Kapalak 25.05.2014 10:33

Непонятное поведение метода при добавлении во встроенный прототип
 
Здравствуйте. Недавно столкнулся с такой непоняткой. Допустим я хочу дописать свой метод в прототип Number. И тут столкнулся с непонятным для меня поведением.
Допустим есть такой код.
Number.prototype.myFunc = function(x) {
  alert('x = ' + x + '\nthis = ' + this);
}

Если записать вызов myFunc так
5..myFunc(1)

То всё работает так как и задумано - x равен 1, а this равен 5.
Но если вызвать метод так:
(5).myFunc(1)

То происходит абсолютно непонятная мне фигня - x становится равным 5, а this ссылается на window. А 1 вообще непонятно куда девается, в arguments ее вообще нет. Хотелось бы узнать что вообще происходит при втором варианте записи?

nerv_ 25.05.2014 11:00

Kapalak, у меня все нормально работает http://learn.javascript.ru/play/iOdFZ

Kapalak 25.05.2014 11:11

Цитата:

Сообщение от nerv_ (Сообщение 313312)
Kapalak, у меня все нормально работает http://learn.javascript.ru/play

По этой ссылке ничего нет...
Вот мой пример: http://learn.javascript.ru/play/QdMbD
В лисе и хроме выводится x = 5, this = window

Aetae 25.05.2014 11:24

Kapalak, лол. Точку с запятой ставить надо.
Number.prototype.myFunc = function(x) {
  alert('x = ' + x + '\nthis = ' + this);
}*!*;*/!*

(5).myFunc(1);

У тебя же получается:
Number.prototype.myFunc = function(x) {
  alert('x = ' + x + '\nthis = ' + this);
}(5).myFunc(1);

Т.е. функция создаётся и сразу вызывается с аргументом 5 в контексте window, а после, уже к возврату функцции(в данном случае undefined) пытается примениться несуществующий пока myFunc, естественно с ошибкой.

Octane 25.05.2014 11:27

коварный JavaScript :D

nerv_ 25.05.2014 11:36

Цитата:

Сообщение от Kapalak
По этой ссылке ничего нет...

теперь есть :D Утро)

Цитата:

Сообщение от Octane
коварный JavaScript

кстати, нет. Коварный будет es6

Kapalak 25.05.2014 11:39

Цитата:

Сообщение от Aetae (Сообщение 313314)
Kapalak, лол. Точку с запятой ставить надо.

ОМГ!!! Мдааааа... Вот никак не могу приучить себя после фигурных скобок точки с запятой ставить. Спасибо.


Часовой пояс GMT +3, время: 19:20.