Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.11.2011, 21:17
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Установить имя конструктора
Возможно ли каким-то образом установить произвольное имя конструктору, который является function expression?
Или только генерируя function declaration и вызывать его через eval?

Добавлено:
Немного лажанул с терминологией. Суть в том, что мне нужно сменить имя любой функции, не важно expression или declaration. Это возможно? Установка свойства "name" естественно не помогает и даже установка геттера на name. Скорее всего, как я понял, это сделать невозможно.

Последний раз редактировалось Андрей Параничев, 15.11.2011 в 22:17.
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2011, 23:39
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Функции и конструкторы в javaScript по сути все безымянны, когда мы создаём функцию, мы обычно создаём ещё и ссылку на функцию И имеем дело в дальнейшем с именами переменных ссылок, но ни как не с именами функций или конструторов.

a=function(x,y){
        alert(x+y);
    }
    b=a; //дадим функции имя b
    c=a; //дадим функции имя c
    
    a(1,1); // вызовем функцию с именем а

    delete a; // УДАЛИМ первое имя функции

    b(1,2); // второе имя функции (работает несмотря на то что первое имя исчезло)
    c(2,3); // третье имя функции (работает несмотря на то что первое имя исчезло)


Декларативная запись даст тот же эффект.

function a(x,y){
        alert(x+y);
    }
    b=a; //дадим функции имя b
    c=a; //дадим функции имя c
    
    a(1,1); // вызовем функцию с именем а

    delete a; // УДАЛИМ первое имя функции

    b(1,2); // второе имя функции (работает несмотря на то что первое имя исчезло)
    c(2,3); // третье имя функции (работает несмотря на то что первое имя исчезло)


уневерсальный метод меняющий "имя функции" в обьекте context.

// метод
function changeName (context,oldname,newname) {
        context[newname]=context[oldname];
        delete context[oldname]; // удаляем старое имя из обьекта
}

// проверка
test={
     functest: function(){
         alert ("привет");
     }
};

// заменим старое имя functest, на новое testNewName
changeName(test, "functest", "testNewName");

// обратимся к функции по новому имени
test.testNewName();


функция даже сама может поменять своё имя, а при необходимости даже самоликвидироваться, унечтожив последнюю ссылку на себя.
test={
     functest: function(){
         alert ("привет");
         // если мы ещё не меняли то поменяем имя функции      
         if (this.functest) {
               this["newnamefunc"]=this.functest;
               delete this.functest; // удалим старое имя функции
         }
                
     }
}

// обратимся к функции, функция сменит своё имя
test.functest();

// обратимся к функции по новому имени
test.newnamefunc();

// попробуем обратится по старому имени, и получим ошибку
test.functest();
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 16.11.2011 в 00:50.
Ответить с цитированием
  #3 (permalink)  
Старый 16.11.2011, 07:47
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от DjDiablo
Функции и конструкторы в javaScript по сути все безымянны
Имя у них как раз есть. Просто это не то же самое, что ссылка на функцию, хотя зачастую они совпадают.
var x = function y() {};
alert('Переменная x: ' + typeof x);
alert('Переменная y: ' + typeof y);
alert('Имя функции: ' + x.name);
Ответить с цитированием
  #4 (permalink)  
Старый 16.11.2011, 08:45
Лаборант :-)
Отправить личное сообщение для Pavel M. Посмотреть профиль Найти все сообщения от Pavel M.
 
Регистрация: 08.11.2011
Сообщений: 804

Сообщение от Kolyaj
Имя у них как раз есть.
по моему .name это не стандартное свойство, лучше им не пользоваться, в ie9, например, x.name не заработало
Ответить с цитированием
  #5 (permalink)  
Старый 16.11.2011, 09:53
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

x.name - константа, помнит имя указанное в момент создания функции.
наличие имени функции в x.name - это не гарант того что функцию можно вызвать по этому имени.
Ума не могу приложить как можно использовать эту историческую справку
а так да, в некоторых браузерах типо имя
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #6 (permalink)  
Старый 16.11.2011, 09:59
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от DjDiablo
наличие имени функции в x.name - это не гарант того что функцию можно вызвать по этому имени.
А где было сказано обратное?


Сообщение от DjDiablo
Ума не могу приложить как можно использовать эту историческую справку
Какую справку?
Ответить с цитированием
  #7 (permalink)  
Старый 16.11.2011, 10:35
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Цитата:
А где было сказано обратное?
Я просто часто сравниваю с другими языками. К примеру c тем же с/c++
строка void test(){ } это гарант в c/c++ того что я всегда смогу вызвать функцию по имени test, в javaScript нет таких гарантий. Нечего другого я сказать не хотел, это не было возражением тебе.

Цитата:
Какую справку?
Это была образная речь, попытка поиска аналогии в реальном мире.
Если раньше человека звали Вася, а после операции и смены паспорта Василиса То справка из паспортного стола о старом имени, помоему очень напоминает значение св-ва name, данное функции при рождении.

Мне кажется или мы флудить начинаем
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 16.11.2011 в 11:31.
Ответить с цитированием
  #8 (permalink)  
Старый 16.11.2011, 21:01
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

Вызов тут не причем. Речь идет только о том, чтобы из this.constructor.name получить имя конструктора. И при псевдо-статическом наследовании получить в .name нужное имя. Так получается, то единственный способ гарантировать это - создавать конструктор с именем.

Но в моей задаче пришлось решить это дело созданием незащищенной constructor.__name__, которая берется из constructor.name или аргумента. В общем не самое красивое решение, но для моей задачи подойдет: мне нужно просто именовать модули в глобальном режиме. Единственный способ это имя конструктора, поскольку мне нужна совместимость с синтаксическим сахаром, генерируемым через CoffeeScript.

Целостность системы у меня отдельно проверяется, так что существование одинаковых имен для меня не проблема.

Последний раз редактировалось Андрей Параничев, 16.11.2011 в 21:06.
Ответить с цитированием
  #9 (permalink)  
Старый 17.11.2011, 08:09
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

В IE у функций нет name.

Ну и не могу не заметить, что решение кривое. Точнее задача в рамках JS кривая, поэтому и решение кривое.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как правильно передвать имя radiobutton в функции boris2000 Элементы интерфейса 2 03.08.2010 20:16
Регулярное выражение, замена ссылки к файлу на имя файла libinstyle Events/DOM/Window 2 19.07.2010 16:50
Как получить имя файла и изменить его? nedosalivan Общие вопросы Javascript 5 29.03.2010 16:51
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 18:00
оприделить имя файла www Общие вопросы Javascript 2 10.08.2008 13:34