@Grundy Там попытка создания собственного свойства объекта (через присваивание, obj.newProp = 'lalala';) натыкается на уже существующее прототипное свойство, и непонятно почему интерпретатор вообще лезет в цепочку прототипов :)
@Grundy Хм... я все же не понимаю: почему берется дескриптор из прототипа, а не из экземпляра? Там же (ранее в порядке выполнения) написано что дескриптор берется как O.[[GetOwnProperty]].
@Grundy «не совсем понял вопрос» - если следовать по цепочке [[Set]] ► OrdinarySet ► OrdinarySetWithOwnDescriptor, то в OrdinarySet дескриптор свойства берется из "целевого" объекта O, а не из его прототипа. В общем, я на этой цепочке впадаю в ступор... лучше подожду ответ :)
Нашел в MDN «Unlike accessor properties, value properties are always set on the object itself, not on a prototype. However, if a non-writable value property is inherited(!!!), it still prevents from modifying the property on the object."» - ссылку на статью тоже можно добавить в ответ.
Вот эту ссылку, если быть точным... А в переводе данную инфу вроде потеряли :)
@Grundy да, и все же отсылка к священному ES-писанию гораздо больше информации дает (тем кто может прочесть эти алгоритмы на эльфийском языке). Плюс, популяризация спецификации это всегда хорошо... а то сейчас очень модно на YouTube и из бесплатных курсов черпать информацию, а там качество информации понятно какое 💩. Некоторые поначалу вообще не знают что спека существует.
@avp эта фича в целом выглядит как костыль, вполне может быть что ей в свое время чинили какое-то другое странное поведение.
Ну, если представлять причины по которым можно решить "а давайте наследовать отдельные части дескриптора", в голову приходят только кейсы связанные с перекрытием свойств, и всяческие веселые баги с путаницей между объектами с ридонли-свойствами и наследниками этих объектов.
А вообще случай очень интересный. Самая его мякотка в том, что у отсутствующих свойств конечно же нет дескриптора (он undefined)... то есть, наследование параметра writable одноименным свойством в таких ситуациях - полностью "прозрачное". Если лезть отлаживать подобные случаи забыв о том что где-то в предках дескриптор изменен, будет очень-очень весело. Этакий полтергейст.
@avp нууу не знаю... на таком хорошем языке будет очень мучительно разрабатывать сложные штуки - ведь всю отсутствующую магию придется самому реализовывать. JS стал популярным во многом благодаря его магии, которая значительно ускоряет и упрощает запись алгоритма кодом.
@Grundy так он весьма быстро из браузера вылез - и до ноды были попытки вытащить эту прелесть из браузера (если не ошибаюсь, на экспериментах с движком из Фаерфокса), а как нода вышла, так сразу началась мощная экспансия. И распространение-то не по воле некой корпорации (как например с Dart, который активно форсится гуглом через Flutter), а чисто силами энтузиастов. При всей репутации JS (взять хотя бы новичковую боль от '1'+1), любителей этого языка оказалось удивительно много.
А что, звучит. Надо сделать девизом JS "Ломаем вещи гибко!"
Кстати, интересно из-за чего гугл "недопропихнул" Dart в Хром вторым языком скриптов. Это же по сути "TS без детских болячек", да еще и без необходимости в транспайле - красота ведь.
Вместо этого зачем-то пошли путем трансляции в JS, и Flutter для веба остается абсолютно неюзабелен до сих пор 😁
@avp для того и нужен - чтобы исцелить боль тех ~50% вебпрограммистов, которые JS'у предпочитают TS: добавив строгую типизацию, и модель ООП близкую к классической.
@yar85 что мешает просто сделать трансляцию с любого языка в JVM интерпретатор и использовать его хоть в браузере, хоть в другом окружении? И писать там на своем любимом языке
@avp не знаю... наверное, мешает общая сложность такой затеи, и вопросы к производительности
Может быть гугл решил что было бы здорово не транслировать множество языков, а создать единый язык программирования для веба, который понравится большинству. И в этом есть некоторый смысл. Например, многим фронтэндерам грустно от того что для написания WA надо изучать Rust и терпеть издевательства его чудесного компилятора :)
Ведь в том что флаттер (как основной фреймворк дарта, нацеленный исключительно на фронтэнд) собирается под две мобильные платформы, веб, и две десктопные - явно есть какие-то проектные корни. Наличие у гугла подобных великих планов "объединить всея вебъ" десять лет назад весьма вероятно. Времечко было смутное. И они вроде официально анонсировали DVM в будущих версиях Хроме, если ничего не путаю.