Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Модули, замыкания и прочие азы / 20 сообщений из 20, страница 1 из 1
04.01.2013, 14:51
    #38100023
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Вот в книжечке нашел пример кода:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 Function.prototype.addMethod = function (methodName, methodBody) {
            this.prototype[methodName] = methodBody;
            return this;// Обеспечивает возможность каскадирования вызовов addMethod.
        }

String.addMethod('deentityifi', function () {

            var entity = {
                qout: '"',
                lt: '<',
                gt: '>'
            };

            return function () {
                return this.replace(/&([A&;]+);/g, function (a, b) {
                    var r = entity[b];
                    return typeof r === 'string' ? r : a;
                });
            };
        }());

        document.writeln('&lt;&quot;&gt;'.deentityifi());



и стало интересно, а чем собственно он будет отличаться от:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
String.addMethod('deentityifi', function () {

            var entity = {
                qout: '"',
                lt: '<',
                gt: '>'
            };

            return this.replace(/&([A&;]+);/g, function (a, b) {
                var r = entity[b];
                return typeof r === 'string' ? r : a;
            });
        });



?
...
Рейтинг: 0 / 0
04.01.2013, 14:59
    #38100027
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Lexxxxxа чем собственно он будет отличатьсятипом возвращаемого результата
...
Рейтинг: 0 / 0
04.01.2013, 15:25
    #38100043
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Паганель,

Почему? В обоих случаях членом deentityifi в прототипе станет функция, которая будет выполнять одни и те же действия.
...
Рейтинг: 0 / 0
04.01.2013, 15:49
    #38100056
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Уважаемый Паганель, не могли бы Вы более детально разъяснить, как различаются типы возвращаемого результата в первом и втором случаях?
...
Рейтинг: 0 / 0
04.01.2013, 15:56
    #38100061
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Lexxxxx
Код: javascript
1.
            return function () {

Код: javascript
1.
            return this.replace(/&([A&;]+);/g, function (a, b) {

http://javascript.ru/String/replace Этот метод не меняет вызывающую строку, а возвращает новую, после замен.чего тут еще подробнее объяснять, я не понимаю
...
Рейтинг: 0 / 0
04.01.2013, 16:08
    #38100066
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Паганельчего тут еще подробнее объяснять, я не понимаю
Обратите пожалуйста внимание на реализацию метода Function.prototype.addMethod, на }()); в первой реализации, и }); во второй. В обоих случаях String.deentityifi будет функция, но в первом случае переменная entity будет доступна этой функции через замыкание,а во втором она будет являться собственной локальной переменной функции. Хотелось бы узнать в чем выгода первого способа (а в книжке к нему даже применен эпитет "идеальный")?
...
Рейтинг: 0 / 0
04.01.2013, 16:15
    #38100072
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
а, ну да, скобок я и не заметил:)
тогда не знаю
это наверное что-то из области комбинаторов неподвижных точек... как-то в жизни мне не приходилось такое творить
...
Рейтинг: 0 / 0
04.01.2013, 16:26
    #38100080
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Не совсем понятно что означают слова "объект будет обрабатываться при каждом вызове функции"?
...
Рейтинг: 0 / 0
04.01.2013, 17:13
    #38100118
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
ну... для этого надо знать как работает интерпретатор
я - не знаю
могу только догадываться, что каждый раз, выполняя функцию,
он должен под все локакльные переменные выделить память и (если указано) проинициализировать данными
наверное, это замедляет работу функции на какие-то наносекунды
...
Рейтинг: 0 / 0
04.01.2013, 17:18
    #38100124
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Паганель,

Я думал что значения из прототипа копируются во все экземпляры объекта. Следовательно во всех экземплярах, имеющих метод deentityifi, прицепленный к прототипу, имеется ссылка на один и тот же метод, а в нем всего одна копия этого entity. (Интересно, а мои мысли о прототипе соответствуют действительности?) И тогда непонятно, что он понимает под обработкой этого объекта?!
...
Рейтинг: 0 / 0
04.01.2013, 17:31
    #38100137
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
не знаю

код
Код: javascript
1.
2.
console.log('string1'.deentityifi);
console.log('string2'.deentityifi);

мне что-то ответа не дал
затрудняюсь придумать эксперимент
...
Рейтинг: 0 / 0
04.01.2013, 17:45
    #38100152
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Паганель,

А разве
Код: javascript
1.
alert('str1'.deentityifi === 'str2'.deentityifi);

не подойдет?
...
Рейтинг: 0 / 0
04.01.2013, 18:01
    #38100168
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
я не знаю говорит ли это о копировании данных
...
Рейтинг: 0 / 0
04.01.2013, 18:06
    #38100173
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Lexxxxx, откуда взяли пример? Что за книга?
...
Рейтинг: 0 / 0
04.01.2013, 18:10
    #38100178
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
...
Рейтинг: 0 / 0
04.01.2013, 18:50
    #38100203
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Паганелья не знаю говорит ли это о копировании данных

Судя по примеру кода и по тому, что при создании нескольких экземпляров объектов их свойства, унаследованные от прототипа, можно менять в каждом экземпляре независимо от других экземпляров, похоже что в каждый вновь созданный экземпляр объекта просто копируются значения из свойств объекта-прототипа.
И судя по
Код: javascript
1.
alert('str1'.deentityifi === 'str2'.deentityifi);// true

копируется ссылка на функцию, а не сама функция. Или это на меня навеяло понятием ссылочных типов из C#. :)
Кто знает правду, подскажите! :)
...
Рейтинг: 0 / 0
05.01.2013, 15:20
    #38100562
Имя пользователя1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Lexxxxxпохоже что в каждый вновь созданный экземпляр объекта просто копируются значения из свойств объекта-прототипа. 13635132
и весь топик почитай
...
Рейтинг: 0 / 0
05.01.2013, 17:12
    #38100609
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Имя пользователя1,

А что там нового написано? Кроме того мне кажется что фраза "однако в объекте, созданном через new Foo(), есть скрытое поле-ссылка (назовем ее "__proto__"), которая ссылается на тот же объект, на который ссылается Foo.prototype (на момент вызова new Foo())" не совсем верна. Так как если бы все созданные через new объекты ссылались бы на один и тот же экземпляр "прототипного объекта", то это привело бы к тому, что изменение значения свойства из прототипа в одном экземпляре объекта приводило бы к отображению этого изменения в остальных экземплярах, в том числе и вновь созданных. Так что похоже каждый объект имеет свой экземпляр "прототипного объекта". Хотя то, что при добавлении свойства в прототип это свойство появляется у всех созданных ранее экземпляров объектов говорит нам о том что "исходный прототипный объект" имеет связь со всеми уже созданными экземплярами объектов. Короче там какой-то хитрый механизм имеется! ) Вроде у каждого экземпляра есть свои копия "прототипного объекта", но добавление свойства в прототип добавляет его и во все его копии у созданных экземпляров.
Никто не знает какой нибудь источник, где хорошо описан этот механизм?
И по основному вопросу темы, так в чем же идеальность первой реализации String.addMethod('deentityifi',...?
...
Рейтинг: 0 / 0
06.01.2013, 06:29
    #38100845
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
LexxxxxТак как если бы все созданные через new объекты ссылались бы на один и тот же экземпляр "прототипного объекта", то это привело бы к тому, что изменение значения свойства из прототипа в одном экземпляре объекта приводило бы к отображению этого изменения в остальных экземплярах, в том числе и вновь созданных.нет.

в момент присвоения новое значение свойства будет записано в сам объект, а не в его прототип. и далее будет считываться с самого объекта (не придется заглядывать в прототипы).

с другой стороны, пример
Код: javascript
1.
2.
3.
4.
5.
6.
7.
Foo.prototype.myProp = {a: 1, b: 2};

var x = new Foo();
var y = new Foo();

x.myProp.a = 55;
alert(y.myProp.b); // 55

подтверждает, что изначально прототипное свойство - общее для всех экземпляров.

LexxxxxТак что похоже каждый объект имеет свой экземпляр "прототипного объекта". Хотя то, что при добавлении свойства в прототип это свойство появляется у всех созданных ранее экземпляров объектов говорит нам о том что "исходный прототипный объект" имеет связь со всеми уже созданными экземплярами объектов. Короче там какой-то хитрый механизм имеется! ) Вроде у каждого экземпляра есть свои копия "прототипного объекта", но добавление свойства в прототип добавляет его и во все его копии у созданных экземпляров.
Никто не знает какой нибудь источник, где хорошо описан этот механизм?поскольку указанного механизма (с копиями прототипов) нет в природе, то и источника с описанием тоже нет (кроме, разумеется, 13726297 )

LexxxxxИ по основному вопросу темы, так в чем же идеальность первой реализации String.addMethod('deentityifi',...?в первом случае всегда используется один и тот же объект entity, во втором - каждый раз создается при вызове deentityifi.
разумеется, нет смысла каждый раз создавать его заново, потому первый вариант лучше.
...
Рейтинг: 0 / 0
06.01.2013, 10:09
    #38100864
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, замыкания и прочие азы
Яростный Меч,

Спасибо.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Модули, замыкания и прочие азы / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]