Установить имя конструктора
Возможно ли каким-то образом установить произвольное имя конструктору, который является function expression?
Или только генерируя function declaration и вызывать его через eval? Добавлено: Немного лажанул с терминологией. Суть в том, что мне нужно сменить имя любой функции, не важно expression или declaration. Это возможно? Установка свойства "name" естественно не помогает и даже установка геттера на name. Скорее всего, как я понял, это сделать невозможно. |
Функции и конструкторы в 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(); |
Цитата:
var x = function y() {}; alert('Переменная x: ' + typeof x); alert('Переменная y: ' + typeof y); alert('Имя функции: ' + x.name); |
Цитата:
|
x.name - константа, помнит имя указанное в момент создания функции.
наличие имени функции в x.name - это не гарант того что функцию можно вызвать по этому имени. Ума не могу приложить как можно использовать эту историческую справку :) а так да, в некоторых браузерах типо имя :D |
Цитата:
Цитата:
|
Цитата:
строка void test(){ } это гарант в c/c++ того что я всегда смогу вызвать функцию по имени test, в javaScript нет таких гарантий. Нечего другого я сказать не хотел, это не было возражением тебе. Цитата:
Если раньше человека звали Вася, а после операции и смены паспорта Василиса :) То справка из паспортного стола о старом имени, помоему очень напоминает значение св-ва name, данное функции при рождении. Мне кажется или мы флудить начинаем :D |
Вызов тут не причем. Речь идет только о том, чтобы из this.constructor.name получить имя конструктора. И при псевдо-статическом наследовании получить в .name нужное имя. Так получается, то единственный способ гарантировать это - создавать конструктор с именем.
Но в моей задаче пришлось решить это дело созданием незащищенной constructor.__name__, которая берется из constructor.name или аргумента. В общем не самое красивое решение, но для моей задачи подойдет: мне нужно просто именовать модули в глобальном режиме. Единственный способ это имя конструктора, поскольку мне нужна совместимость с синтаксическим сахаром, генерируемым через CoffeeScript. Целостность системы у меня отдельно проверяется, так что существование одинаковых имен для меня не проблема. |
В IE у функций нет name.
Ну и не могу не заметить, что решение кривое. Точнее задача в рамках JS кривая, поэтому и решение кривое. |
Часовой пояс GMT +3, время: 23:52. |