Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Тонкости создания прототипов (https://javascript.ru/forum/misc/63521-tonkosti-sozdaniya-prototipov.html)

pomidor_makaronus 12.06.2016 22:42

Тонкости создания прототипов
 
Друзья, подскажите, почему этот вариант прототипа не делает доступной функцию getTags, а тот который закомментирован - да?
function Element(){

			if( typeof Element.getTags !== "function"){
				//Element.prototype.getTags = function( elem ){ console.log( elem );}

				Element.prototype = {
					constructor: Element,
					getTags : function( elem ){ console.log( elem );}

				}
			}
		}
 	
		var el  = new Element();
		el.getTags();

Яростный Меч 13.06.2016 00:42

к моменту выполнения кода внутри функции Element() у создаваемого объекта уже установлен старый прототип. Закомментированный код добавляет функцию в этот прототип, а нерабочий вариант просто заменяет Element.prototype, что никак не сказывается на прототипе объекта - он остается прежним.

pomidor_makaronus 13.06.2016 02:06

Cпасибо! звучит логично, но вот в книге Фленагана, алгоритм создания
нового объекта, как-то не похож:

Для создания экземпляров Person используется оператор new. В результате выполняются
четыре действия:
1. Создание объекта.
2. Назначение нового объекта переменной t h i s конструктора (после чего t h i s
указывает н а новый объект).
3. Выполнение кода внутри конструктора (добавление свойств к новому объекту).
4. Возвращение нового объекта.

Пытаюсь сопоставить ваш ответ с этим алгоритмом и напрашивается только один ответ: ссылка на прототип объекта возвращается вновь созданному объекту раньше чем происходит его инициализация! Пожалуйста дайте ссылку на материал, где можно это уточнить. Дело в том что пункты 3 и 4 очень уж смущают

aklis 13.06.2016 02:29

Ну в этом алгоритме про прототипы ничего не вижу.

aklis 13.06.2016 02:38

мне кажется или когда Element работает в режиме конструктора код ТС просто игнорируется? Я имею в виду что если исполнить снаружи функции, код меняющий прототип, то работать он таки будет.

aklis 13.06.2016 02:41

function Element(){
 
            if( typeof Element.getTags !== "function"){
                //Element.prototype.getTags = function( elem ){ console.log( elem );}
                Element.prototype = {
                    constructor: Element,
                    getTags : function( elem ){ console.log( elem );}
                }
            }
        }
        Element(); // или просто вызвать ее как обычную функцию, чтобы записать прототип
        var el  = new Element();
        el.getTags();

Уже размышляю насчет поспать, так что не проверял как это работает, все это просто мои мысли из разряда "а что если..." . Всем неспящим до завтра ;)

aklis 13.06.2016 10:49

Проверил, и правда так работает. Видимо конструктор работает в особом режиме, в котором код ТС игнорируется. Я вроде где-то про это читал (про особый режим работы конструкторов), не помню где только.

pomidor_makaronus 13.06.2016 11:24

Что такое код TC, что-то не могу расшифровать абривиатуру?
Мне кажется не то чтобы код игнорировался просто: получается что когда
выполняется строчка
var el  = new Element();

первым делом объект var el получает ссылку на прототип, а уже потом запускается алгоритм Фланагана?... И инфу не могу найти. Может чего не дочитал еще... Товарищи делитесь соображениями.

aklis 13.06.2016 11:35

ТС - topic starter.

var el - это переменная, тобишь именованная область памяти, куда мы записываем данные - это не сам объект. Ей присваивается ссылка на уже готовый объект.

Яростный Меч 13.06.2016 11:36

Цитата:

Сообщение от pomidor_makaronus (Сообщение 419238)
Мне кажется не то чтобы код игнорировался просто: получается что когда
выполняется строчка
var el  = new Element();

первым делом объект var el получает ссылку на прототип, а уже потом запускается алгоритм Фланагана?....

Это происходит в п.1 алгоритма


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