Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить объект содержащий caller (https://javascript.ru/forum/misc/3120-poluchit-obekt-soderzhashhijj-caller.html)

no_alex 20.03.2009 02:16

Цитата:

так подойдет?
Увы нет. Это совершенно разные объекты. Они не должны иметь ничего общего.

Хотя я уже думал над чем-то подобным. Но я хотел в прототип как-то "вплести" третий (вспомогательный) объект. Но пока не придумаю как...

Gvozd 20.03.2009 02:24

я исчерпался

Zeroglif 20.03.2009 16:06

no_alex,

Если вы внутри функции 'A.t' откажетесь от той идеи, что значением 'this' должен быть исключительно объект 'A' и станете обращаться к нему по имени, то можно уйти от аргумента в пользу версии с 'apply' или её более упрощённого собрата. Это если вы не хотите кого-то инструктировать про аргумент...

C другой стороны, вариант с передачей аргумента вряд ли можно назвать "нагружающим" процесс создания объектов, прототип создаётся один раз, вычисление значения 'this' в момент вызова мгновенное и т.д. Что касается варианта с 'caller', то это не кроссбраузерное решение, к тому же само свойство 'deprecated'...

no_alex 20.03.2009 17:59

Цитата:

Если вы внутри функции 'A.t' откажетесь от той идеи, что значением 'this' должен быть исключительно объект 'A'
Там так не получится. Это здесь, в качестве примера, я показал A, как один простой объект. На самом деле, у меня таких обектов будет несколько и каждый со своим законченным функционалом. Именно поэтому мне нельзя их "переплетать" между собой и this там должен обязательно указывать на "оригинал".

Цитата:

вариант с передачей аргумента вряд ли можно назвать "нагружающим" процесс создания объектов
Не скажу чтобы оно сильно нагружало, но если бы можно было его убрать, было-бы хорошо. Сейчас у меня такие вызовы (с "this") всречаются примерно в каждой ~5-10 строке.

Цитата:

с 'caller', то это не кроссбраузерное решение
Действительно старая Opera 8.53 его не понимает. :(
В остальных браузерах:
- FF2, FF3 и другие браузеры на мозилловском движке (NN, Flock);
- IE6, IE7;
- Opera 9;
- Safari;
- Google Chrome;
нормально отрабатывает.
Я думаю, что если речь идет только об Opere 8 и ниже, то на это можно "забить".

Цитата:

к тому же само свойство 'deprecated'
Вот это уже заставляет задуматься! Можете показать где это написано?

Zeroglif 20.03.2009 21:37

Цитата:

Сообщение от no_alex
если речь идет только об Opere 8 и ниже

Боюсь ошибиться, но свойство 'Function.caller' появилось очень давно, где-то в JavaScript 1.1, в JScript соответственно следом. Позднее в JavaScript 1.2 добавили свойство 'arguments.caller', которое в следующей же версии от страха прибили (вот оно как раз открытым текстом deprecated в JavaScript 1.3). При этом свойство 'Function.caller' из offline-спеков JavaScript выпало вообще (deprecated закрытым текстом), вы его найдёте только в новомодной редактируемой MDC, B.Eich объяснял пропажу так:

All traces of a caller property were removed a while ago, to follow ECMA-262 and to avoid any chance of a security exploit. The removal seems to me to have been overzealous, because it axed the caller property of function objects *and* the much-more-exploitable caller (or __caller__) property of activation objects.

В общем, в основных движках свойство сидит с прошлого века, но в одном из них временно отстутствовало, выпадая из спеков. Все остальные традиционно бедны последовательной документацией, в Opera точно не было долго (помню был такой вопрос на винграде), в Safari ещё труднее сказать... свойство вне стандарта, редко используемое, может взбрыкнуть. ;)


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