Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.06.2016, 22:42
Интересующийся
Отправить личное сообщение для pomidor_makaronus Посмотреть профиль Найти все сообщения от pomidor_makaronus
 
Регистрация: 19.04.2016
Сообщений: 18

Тонкости создания прототипов
Друзья, подскажите, почему этот вариант прототипа не делает доступной функцию 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();
Ответить с цитированием
  #2 (permalink)  
Старый 13.06.2016, 00:42
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

к моменту выполнения кода внутри функции Element() у создаваемого объекта уже установлен старый прототип. Закомментированный код добавляет функцию в этот прототип, а нерабочий вариант просто заменяет Element.prototype, что никак не сказывается на прототипе объекта - он остается прежним.
Ответить с цитированием
  #3 (permalink)  
Старый 13.06.2016, 02:06
Интересующийся
Отправить личное сообщение для pomidor_makaronus Посмотреть профиль Найти все сообщения от pomidor_makaronus
 
Регистрация: 19.04.2016
Сообщений: 18

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

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

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

Последний раз редактировалось pomidor_makaronus, 13.06.2016 в 02:09.
Ответить с цитированием
  #4 (permalink)  
Старый 13.06.2016, 02:29
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Ну в этом алгоритме про прототипы ничего не вижу.
Ответить с цитированием
  #5 (permalink)  
Старый 13.06.2016, 02:38
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

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

Последний раз редактировалось aklis, 13.06.2016 в 02:43.
Ответить с цитированием
  #6 (permalink)  
Старый 13.06.2016, 02:41
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

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 в 02:46.
Ответить с цитированием
  #7 (permalink)  
Старый 13.06.2016, 10:49
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Проверил, и правда так работает. Видимо конструктор работает в особом режиме, в котором код ТС игнорируется. Я вроде где-то про это читал (про особый режим работы конструкторов), не помню где только.
Ответить с цитированием
  #8 (permalink)  
Старый 13.06.2016, 11:24
Интересующийся
Отправить личное сообщение для pomidor_makaronus Посмотреть профиль Найти все сообщения от pomidor_makaronus
 
Регистрация: 19.04.2016
Сообщений: 18

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

первым делом объект var el получает ссылку на прототип, а уже потом запускается алгоритм Фланагана?... И инфу не могу найти. Может чего не дочитал еще... Товарищи делитесь соображениями.
Ответить с цитированием
  #9 (permalink)  
Старый 13.06.2016, 11:35
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

ТС - topic starter.

var el - это переменная, тобишь именованная область памяти, куда мы записываем данные - это не сам объект. Ей присваивается ссылка на уже готовый объект.
Ответить с цитированием
  #10 (permalink)  
Старый 13.06.2016, 11:36
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

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

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать мастер создания памятника ? cosskay Общие вопросы Javascript 0 20.05.2014 17:47
EruditionCMS - веб-приложение для создания и проведения тестирований mbcsoft Ваши сайты и скрипты 0 08.05.2014 13:12
Ищу партнера для создания интернет проекта Zenders Работа 5 28.05.2013 19:31
Поиск и выбор папки с максимально поздней датой создания. Майя Общие вопросы Javascript 1 13.04.2012 16:11
Ищу программиста для сотрудничества, ищу программиста для создания браузерной игры He3HaUKa Javascript под браузер 3 25.04.2011 20:53