Эта статья дает вам необходимые знания о JavaScript, в котором в основном рассматриваются связанные с объектно-ориентированными вопросами, включая дескрипторы атрибутов, дескрипторы данных, дескрипторы доступа и т. д. Давайте посмотрим на это вместе, я надеюсь, что это будет полезно для всех.
[Рекомендации по теме: видеоурок по JavaScript, веб-интерфейс]
JavaScript фактически поддерживает множество парадигм программирования, включая функциональное программирование и объектно-ориентированное программирование:
Объекты в JavaScript спроектированы как неупорядоченная коллекция атрибутов , например таблица хип-хопа, состоящая из ключей и значений;
Ключ — это имя-идентификатор, а значение может быть любого типа или другого типа объекта или функции;
Если значение является функцией, то мы можем назвать его методом объекта ;
Самый распространенный способ создания объектов на ранних этапах — использовать класс Object и использовать ключевое слово new для создания объекта, а затем сохранять свойства или методы в объекте:
вар объект = новый объект() obj.name = 'почему' console.log(obj.name, obj) // почему { name: 'why' }
Позже многие разработчики ради удобства создавали объекты непосредственно в виде литералов:
//Литеральный метод var obj2 = { name: 'jam', age: '8' } console.log(obj) // { name: 'jam', age: '8' }
Раньше наши свойства определялись непосредственно внутри объекта или добавлялись непосредственно к объекту;
Но таким образом мы не можем наложить некоторые ограничения на этот атрибут: например, можно ли удалить этот атрибут через delect
и можно ли его пройти во время обхода for-in
?
Если мы хотим иметь более точный оперативный контроль над атрибутом, то я могу использовать дескрипторы атрибутов . Свойства объекта можно точно добавить или изменить с помощью дескрипторов свойств;
Дескрипторы свойств должны использовать Object.defineProperty
для добавления или изменения свойств.
属性描述符分为两种:数据描述符和存取描述符
Дескриптор данных — это свойство со значением, которое может быть доступно или не доступно для записи. Дескриптор данных имеет следующие необязательные значения ключей:
значение: значение, соответствующее этому атрибуту. Может быть любым допустимым значением JavaScript (числовым значением, объектом, функцией и т. д.). Значение по умолчанию не определено.
возможность записи: если и только если возможность записи этого атрибута равна true, значение может быть изменено оператором копирования. По умолчанию — ложь.
configurable: Если и только если configurable атрибута имеет значение true, дескриптор атрибута может быть изменен, а атрибут также может быть удален из соответствующего объекта. По умолчанию — ложь.
enumerable: если и только если перечисляемое свойства истинно, свойство может появиться в свойстве перечисления объекта. По умолчанию — ложь.
Метод Object.getOwnPropertyDescriptor() возвращает дескриптор свойства, соответствующий собственному свойству указанного объекта.
Object.getOwnPropertyDescriptor(obj, prop)
obj: целевой объект, который нужно найти
prop: имя атрибута в целевом объекте (тип String).
Возвращаемое значение: если указанное свойство существует в объекте, возвращается объект дескриптора его свойства, в противном случае возвращается неопределенное значение.
Примечание. Если первый параметр этого метода не является объектом, будет сообщено об ошибке (TypeError).
Метод Object.defineProperty() напрямую определяет новое свойство объекта или изменяет существующее свойство объекта и возвращает объект.
Object.defineProperty(obj, prop, дескриптор)
obj: объект, свойства которого должны быть определены.
prop: имя свойства, которое необходимо определить или изменить.
дескриптор: дескриптор атрибута, который необходимо определить или изменить.
Возвращаемое значение: объект, переданный функции.
В следующем примере кода показано задание и получение дескрипторов атрибутов var obj = { название: 'варенье', возраст: 8 } Object.defineProperty(obj, 'задание', { значение: 'юрист' }) console.log(Object.getOwnPropertyDescriptor(obj, 'age')) // { значение: 8, возможность записи: true, перечисляемое: true, настраиваемое: true } console.log(obj.job) // Юрист // Новое свойство через defineProperty, это новое свойство не подлежит изменению, не удаляется и не перечисляется console.log(Object.getOwnPropertyDescriptor(obj, 'job')) / / {значение: «Юрист», возможность записи: ложь, перечисляемое: ложь, возможность настройки: ложь}
注意:通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的
вар объект = { название: 'варенье', возраст: 8 } Object.defineProperty(obj, 'адрес', { значение: «Хэбэй», // настраиваемое Это свойство нельзя удалить, и вы не можете использовать defineProperty для повторного изменения дескриптора свойства настраивается: false, }) delete obj.address // Я хочу использовать delete, чтобы удалить этот атрибут obj.address = 'Guangzhou' // Я хочу изменить значение адреса атрибута в obj на Гуанчжоу console.log(obj.address) // Результат вывода: Хэбэй
Поскольку настраиваемое значение дескриптора атрибута имеет значение false и не может быть удалено или изменено, удаление и изменение не вступят в силу.
вар объект = { название: 'варенье', возраст: 8}Object.defineProperty(obj, 'sex ', { значение: «Мужской», // enumerable определяет, можно ли перечислить это свойство enumerable: true})for (i in obj) { console.log(i)}
Если перечисляемое: false, выходным результатом будет возраст имени.
Если перечисляемое: true, выходным результатом будет имя, возраст, пол.
вар объект = { название: 'варенье', возраст: 8}Object.defineProperty(obj, 'оценка', { значение: 80, // доступно для записи: правда доступно для записи: false})obj.score = 100 console.log(obj.score) // 80
Поскольку значение writeable равно false, когда оценка изменяется на 100, модификация не будет успешной, и окончательный результат будет равен 80.
Считаете ли вы, что задавать дескриптор только одного свойства за раз сложно? Object.defineProperties может помочь вам решить эту проблему.
Метод Object.defineProperties() определяет одно или несколько новых свойств или изменяет существующие свойства объекта и возвращает объект.
Object.defineProperties(obj, реквизит)
obj: объект, свойства которого должны быть определены.
реквизит: объект, перечислимые свойства или измененные дескрипторы свойств которого должны быть определены.
Возвращаемое значение: объект, передаваемый функции.
Пример кода выглядит следующим образом:
вар объект = { имя: 'джем',}Object.defineProperties(obj, { 'возраст': { значение: 28, записываемый: правда, настраивается: ложь, перечисляемый: правда }, 'работа': { значение: 'юрист', записываемый: правда, настраивается: ложь, перечисляемый: правда }, 'секс': { значение: «Мужской», записываемый: ложь, настраивается: ложь, перечисляемый: правда }, 'высота': { значение: '1,8 м', записываемый: ложь, настраивается: ложь, перечисляемый: правда }})console.log(obj) // имя: «джем», возраст: 28, должность: «юрист», пол: «мужской», рост: «1,8 м» }
Дескрипторы доступа — это свойства, описываемые парами функций получения-установки. Дескриптор доступа имеет следующие необязательные значения ключей:
get: предоставляет метод получения для свойства. Если метод получения отсутствует, он не определен. При доступе к этому свойству метод будет выполнен. При выполнении метода никакие параметры не передаются, но будет передан этот объект.
set: предоставляет метод установки для свойства. Если метод установки отсутствует, он будет неопределенным. Этот метод срабатывает при изменении значения свойства. Этот метод будет принимать единственный параметр, который является новым значением параметра свойства.
configurable: Если и только если configurable атрибута имеет значение true, дескриптор атрибута может быть изменен, а атрибут также может быть удален из соответствующего объекта. По умолчанию — ложь.
Enurnerable: Если и только если перечисляемое атрибута истинно, атрибут может появиться в атрибуте перечисления объекта. По умолчанию — ложь.
Использование configurable и enurnerable соответствует использованию в дескрипторах данных, поэтому я не буду объяснять их здесь подробно.
В основном поговорим об использовании методов get и set.
вар объект = { название: 'варенье', возраст: 8, _адрес: 'Хэбэй' } // Сценарии использования дескрипторов доступа // 1. Скрыть определенный частный атрибут, который, как ожидается, будет напрямую использоваться и назначен внешним миром // 2. Если мы хотим понять процесс доступа и установки значения определенного атрибута , мы также будем использовать его. Дескриптор свойства хранилища Object.defineProperty(obj, 'address', { перечислимое: правда, настраивается: правда, получить: функция () { фу() верните этот._адрес }, набор: функция (значение) { бар() this._address = значение } }) функция foo () { console.log("Один раз перехвачено значение адреса") } функциональная панель () { console.log("Значение адреса устанавливается один раз") }
Консоль приведенного выше примера кода выводит следующие результаты: