Спецификация Ecma-262. Пункт 8.7.2 PutValue(V,W) не до конца ясен алгоритм.
Здравствуйте.
В пункте 8.7.2 PutValue представлено два алгоритма: один основной, второй, если на шаге 4.a. первого получаем значение HasPrimitiveBase(V) === true - то для назначения свойства используется второй алгоритм. Как я понимаю, во второй алгоритм мы попадаем, если пытаемся задать свойство объекту, которое у него есть и primitive type (Boolean, String, Number), как указано на предыдущей странице спецификации. Если свойство можно записать, то мы попадаем на шаг 3. Где получаем Property Descriptor свойства. А так как мы хотим изменить свойство, которое есть у объекта и примитивного типа, то мы и должны, как я полагаю получить data descriptor. Но на следующем шаге, если мы получили data descriptor, то мы вообще либо Exception выкидываем, либо просто выходим из программы не назначая свойства. По аналогии с предыдущим пунктом спецификации 8.7.1 GetValue, где в пункте 4 второго алгоритма, если это data descriptor, то мы возвращаем значение return desc.[[value]], так же и здесь, наверное, надо назначать свойство через desc.[[value]] = W, а мы выдаем ошибку и выходим. Так же можете пояснить 1 шаг второго алгоритма, что значит toObject(base). В моем примере, как я понимаю, base это примитивное значение. Допустим было myObj.m = 33, то base будет равно 33, и что в таком случае значит 1. Let Obj be ToObject( 33 ) ? Можно ещё привести небольшой код, с пояснением, в каком случае эти пункты работают, я так понимаю, когда мы пишем: var myO = {}; myO.myName = 33; /* Здесь вступает в работу пункт 3 первого алгоритма из PutValue, так как свойства несуществует, то IsUnresolveableReference должна дать true, и так как у нас не strict mode, то мы выполняем 3.b А дальше, если пишем: */ myO.myName = 55; /* То уже должен вступить пункт 4 в дело, и тут я перестаю понимать, что к чему. */ |
Часовой пояс GMT +3, время: 12:40. |