Курсовая работа (проект) Курстық жұмыс (жоба) тақырыбы Тема курсовой работы (проекта) Разработка сайта об автомобилях с помощью JavaScript


Сравнительный обзор сайтов автомобильных компаний



бет3/7
Дата30.04.2024
өлшемі65.5 Kb.
#500219
түріКурсовая
1   2   3   4   5   6   7
Лесбек Әділет курсавой

1.2 Сравнительный обзор сайтов автомобильных компаний

Подобно этому процессу поиска по цепочке, если вы используете цикл for..in для перебора объекта, любое свойство, к которому можно получить доступ через его цепочку (также перечислимое — см. главу 3), становится перечисляемым. был назван. Если вы используете иноператор для проверки наличия у объекта свойства, проверяется вся последовательность объекта (независимо от перечисления):


вар другойОбъект = { а: 2
};
// создаем объект, связанный с `otherObject' var myObject = Object.create(otherObject);
for (var k в myObject) { console.log("Найдено: " + k);
}
// найти
(«а» в myObject); // настоящий
Таким образом, при выполнении поиска свойств различными способами цепочка просматривается по одному звену за раз. Как только свойство найдено или последовательность завершена, поиск прекращается.
Верхний конец каждой нормальной цепочки представляет собой вложенный Object.prototype. Этот объект содержит различные общие утилиты, используемые во всех JS, поскольку все обычные (встроенные, не зависящие от хоста расширения) объекты в JavaScript «спускаются» (например, их [[Prototype]] находится на вершине цепочки.) Объект Object.prototype.
Некоторые из утилит, которые вы найдете здесь, включают .to String() и .valueOf(). В главе 3 мы представили еще один: .hasOwnProperty(..). Еще одна функция в файле тотипа Object.pro, с которой вы, возможно, не знакомы, — это .isPrototypeOf(..), о которой мы поговорим позже в этой главе.
Если объект myObject уже имеет обычный метод доступа к данным, называемый food, его назначение так же просто, как изменение значения существующего свойства.
Если foo не находится непосредственно в myObject, передается цепочка [[Proto type]], как и операция [[Get]]. Если foois не найден нигде в цепочке, свойство foo является непосредственно myObject с указанным значением, как и ожидалось. Включено.
Однако, если foo уже находится выше в цепочке, более тонкое (и неожиданное) поведение может произойти с присвоением myOb ject.foo = "exists". Мы расскажем об этом более подробно чуть позже.
Если имя свойства foo заканчивается как в самом myObject, так и выше в цепочке, начинающейся с myObject, это называется затенением. Fooproperty непосредственно в myObjects будет затенять любое свойство foo, которое находится выше в цепочке, поскольку myOb ject.foolookup всегда найдет самое низкое fooproperty в цепочке.
Как мы только что упомянули, затенение foo в myObject не так просто, как кажется. Теперь рассмотрим три сценария назначения myObject.foo="bar", если foo находится не в myObjectdirectly, а находится на более высоком уровне цепочки myObject:
1. Если где-либо в цепочке найден обычный метод доступа к данным, называемый foois (см. главу 3), и он не помечен как доступный только для чтения (доступен для записи: false), новое свойство с именем foois добавляется напрямую. myObject, в результате чего появляется свойство тени.
2. Если foo находится выше в последовательности, но для него установлено значение «только для чтения» (writeable:false), то происходит как установка этого существующего свойства, так и создание свойства Shadow в myObject. не допускается. Если код выполняется в строгом режиме, будет выдана ошибка. В противном случае установка значения свойства игнорируется. В любом случае, тени не появляется.
3. Если foo находится выше в цепочке и является сеттером (см. главу 3), то сеттер вызывается всегда. Никакой foo не добавляется (или не затеняется) в myObject, и установщик foo не переопределяется.
Многие разработчики предполагают, что назначение свойства ([[Paste]]) всегда приведет к затенению, если свойство уже находится выше в цепочке, но, как видите, это верно только в одном из трех случаев. только что описанный (случай 1).
Если вы хотите скрыть случаи foo 2 и 3, вы не можете использовать =assignment, вместо этого вы должны использовать Object.defineProperty(..) (см. главу 3), чтобы добавить foo к myObject.
Случай 2, пожалуй, самый удивительный из трех. Наличие свойства, доступного только для чтения, предотвращает неявное создание (затенение) свойства с тем же именем ниже по цепочке. Причиной этого ограничения является, прежде всего, усиление иллюзии наследования классов. Если вы думаете, что fooat наследует (скопирует) цепочку myObject, то имеет смысл использовать свойство, недоступное для записи, этого свойства fooat в myObject. Если вы отделите иллюзию от факта и признаете, что такого наследования на самом деле не происходит (см. главы 4 и 5), будет неестественно запрещать myObject иметь свойство false только потому, что какой-то другой объект имеет непереписываемое значение false. . Это ограничение применимо только к =assignment, но еще более странно то, что оно не применяется при использовании Object.defineProperty(..).
Техники затенения приводят к уродливому псевдополиморфизму (см. главу 4), если между ними требуется представление. Обычно затенение более сложное и тонкое, чем оно того стоит, поэтому вам следует стараться избегать его, когда это возможно. См. главу 6 об альтернативном шаблоне проектирования, который, среди прочего, избегает затенения в пользу чистых альтернатив.
Тень может существовать даже в скрытой форме, поэтому будьте осторожны, пытаясь избежать ее. Учитывать:
вар другойОбъект = { а: 2
};
вар myObject = Object.create(otherObject);
другойОбъект.а; // 2 мойОбъект.а; // 2
другойОбъект.hasOwnProperty("а"); // true myObject.hasOwnProperty( "a"); // ЛОЖЬ
мойОбъект.а++; // ой, скрытая штриховка!
другойОбъект.а; // 2 мойОбъект.а; // 3
myObject.hasOwnProperty("a"); // настоящий
Может показаться, что он должен искать myObject.a++ (через делегирование) и вместо этого увеличивать свойство AnotherObject.a, вместо этого действие ++ соответствует myObject.a = myObject.a + 1 . Результатом является поиск свойства с помощью [[Get ]] для получения текущего значения 2 из другого объекта.a, умножения значения на единицу, а затем [[Put]]3 присвоения значения новому затененному свойству a в myObject. . Ой!



Достарыңызбен бөлісу:
1   2   3   4   5   6   7




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет