Шрифт
Вопрос №6894 от пользователя Илья Токарев в уроке «Позднее связывание», курс «JS: Прототипы»
Play

Вопрос №6894 от пользователя Илья Токарев в уроке «Позднее связывание», курс «JS: Прототипы»

Не совсем понял, функция же и есть конструктор что значит описывать ее вне конструктора?

Уточните, к какому конкретно фрагменту учебного материала относится Ваш вопрос?

При определении функции внутри конструктора есть одна деталь. Функция создается каждый раз заново, это означает что сравнение объектов даже в случае deepEqual будет давать false. Ведь функция это объект, а объекты друг другу не равны (даже если структура одинаковая), если это не один и тот же объект. По этой причине функцию нужно описывать вне конструктора (выше в файле), а внутри присваивать ее соответствующему свойству.

функция же и есть конструктор что значит описывать ее вне конструктора?

Здесь речь идёт о разных функциях: о самом конструкторе-функции и о функции, которую надо будет записать как свойство создаваемого объекта.

Если определять (и потом, соответственно, записывать в свойство this) такую функцию внутри конструктора, то, например, два созданных на его основе объекта будут иметь значением данного свойства разные функции (пускай и имеющие абсолютно одинаковый код). Тогда как, если определить такую функцию вне конструктора, то свойства созданных на его основе объектов будут ссылаться на одну и ту же функцию. Т.е. в соответствующее свойство создаваемого объекта всегда будет записываться не разные функции, а ссылка на одну и ту же (определённую за пределами конструктора) функцию.

Так ведь объект создается на основе конструктора? какую функцию нам надо записать в свойство? Там ведь

Node.apply(this, [name, attributes]); this.body = body; this.children = children; this.toString = function toString()

и все. Все свойства name, attributes, body, children,toString я что-то совсем не так понял?

Это не условие задачи - это подсказка, которая, возможно, Вам пригодится при решении задачи. ;) Поэтому не стоит изначально зацикливаться на подсказке и строить своё решение исходя из неё. Если и когда столкнётесь с соответствующей проблемой, тогда она станет актуальной.

Так я и столкнулся) Как раз эта ошибка. Не понимаю подсказку, какую функцию надо будет записать как свойство создаваемого объекта? у него же одна функция toString? Ведь функция которая импортируется в buildNode.js и есть конструктор, получается мне нужно вынести конструктор из конструктора?) И зачем вообще сравнивать объекты, в итоге же все равно строчки сравниваем?

Представьте, что подсказки не существует, и начните писать решение задачи без её учёта.

Так я и столкнулся) Как раз эта ошибка.

Приведите вывод ошибки и опишите, что конкретно вызывает затруднение при её исправлении.

Представьте, что подсказки не существует, и начните писать решение задачи без её учёта.

Так я так и сделал. Я с самого начала подсказку не понял и начал так делать. Ошибка та что в подсказке

Там вывод огромный, все аст дерево. Тест toString проходит.

При определении функции внутри конструктора

Я не определял ни какую функцию внутри конструктора, я сдела все как в видео 1 в 1. Первый конструктор:

И для чего мы вообще объекты сравниваем, нас же в конечном итоге строки интересуют?

значит, Вам необходимо сделать так, чтобы ошибка не появлялась). В противном случае, цитирую:

опишите, что конкретно вызывает затруднение при её исправлении.

Я не определял ни какую функцию внутри конструктора, я сдела все как в видео 1 в 1.

опираться следует, прежде всего, на условие задания и спецификацию (тесты solution.test.js) - примеры, используемые в лекциях, никак не обязаны демонстрировать решение практики, тем более "1 в 1"

И для чего мы вообще объекты сравниваем, нас же в конечном итоге строки интересуют?

для проверки того, что Ваши классы поддерживают генерацию корректного абстрактного синтаксического дерева (AST). Т.е. идёт проверка не только render-операции, но и парсинга (parse). В тестах происходит рекурсивное сравнение двух объектов (AST) по значениям их свойств. При этом свойства, предназначенные для хранения функции, будут одинаковыми, если в этих свойствах лежат ссылки на одну и ту же функцию. Определяя функцию внутри конструктора, вы каждый раз записываете в соответствующее свойство ссылку на новую функцию; определяя функцию вне конструктора, вы каждый раз записываете в соответствующее свойство ссылку на одну и ту же функцию ;)

В результате вынес toString из конструктора, заработало) Собственно это было первое о чем подумал, когда тест не прошел, но сразу же подумал что это бред. Я думал что проблема в том, что конструктор каждый раз создает новый объект, и теперь я не понимаю почему он создает один и тот же объект) new ведь создает экземпляр объекта? Получается что buildNode при вызове с одинаковыми аргументами возвращает один и тот же объект? Как-то не логично, как мне кажется она должна возвращать одинаковые объекты, но не один и тот же.

конструктор каждый раз создает новый объект

Получается что buildNode при вызове с одинаковыми аргументами возвращает один и тот же объект?

Как-то не логично, как мне кажется она должна возвращать одинаковые объекты, но не один и тот же.

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

📎📎📎📎📎📎📎📎📎📎