1. Резерв знаний:
1. Функции, которые перечисляют имена атрибутов:
(1) Для ... в: Вы можете пройти все перечисленные свойства в объекте (включая собственные свойства и унаследованные свойства) в теле петли.
(2) object.keys (): возвращает массив (перечисляемые атрибуты)
(3) object.getownpropertynames (): все собственные свойства
3. Свойства атрибутов: атрибуты данных и атрибуты доклада
(1) Атрибуты данных: записываемое перечисляемое настраиваемое значение
Атрибут данных имеет только одно простое значение;
(2) Атрибуты аксессуаров: write (set), read (get), перечисляемый, настраиваемый
Аксессуары не подлежат записи (т.е. нет функции для записи).
Если атрибут имеет метод установки, то этот атрибут можно записать, и есть метод GET, то этот атрибут читабелен.
4. Методы определения свойств атрибутов: object.defineproperty (объект, атрибут, объект дескриптора)
5. Получить объект дескриптора свойства: Object.getOwnPropertyDescriptor (объект, свойство)
2. Пример
1. Согласно использованию для ... в, мы можем написать метод для имитации «наследования»:
<script type = "text/javascript"> var Child = {}; var Mother = {name: "Zhangzhiying", Lastage: 21, Sex: "Женский"}; функция extend (target, source) {for (var p in source) {target [p] = source [p]; } return Target; } extend (ребенок, мама); console.log (ребенок); // <strong> Object {name: "Zhangzhiying", Lastage: 21, Sex: "Женщина"} </strong> </script>2. Используйте для цикла через свойства объекта прототипа, а затем назначьте значения нашим пустым объектам один за другим, таким образом, реализуя «наследование». Эта идея очень правильная. Давайте изменим приведенный выше пример:
<script type = "text/javascript"> var Child = {}; var mother = {name: "zhangzhiying", lastage: 21, <strong> set age (value) {this.lastage = value; }, get age () {return this.lastage+1; }, </Strong> sex: "женский"}; <br> <strong> mother.age = 15; </strong> // Существует заданный метод, который имеет функцию записи, расширяется (Target, Source) {for (var p в источнике) {target [p] = source [p]; } return Target; } extend (ребенок, мама); console.log (ребенок); // <strong> Object {name: "zhangzhiying", Lastage: 15, возраст: 16, пол: "Женщина"} </strong> </script>Вы можете видеть, что пара наборов используется в коде, Get; где возраст является атрибутом аксессуара.
Результат прогона: нормальный объект, который не содержит установленного, получить.
Заключение: «Наследование», реализованное для IN, не обрабатывает набор и получение, он преобразует атрибут доклада (возраст) в статический атрибут данных.
3. Установите атрибуты данных для материнского объекта
<script type = "text/javascript"> var Child = {}; var mother = {name: "zhangzhiying", lastage: 21, set age (value) {this.lastage = value; }, get age () {return this.lastage+1; }, секс: "женский"}; Object.DefineProperty (мать, "Labage", {writeble: false}); // устанавливают Lastage, чтобы не быть зарегистрированной Mother.age = 15; // Установить недействительный, поскольку значение задержки остается неизменной, Lastage+1 остается неизменной, то есть возраст остается неизменной функцией Extend (Target, Source) {for (var p в источнике) {target [p] = source [p]; } return Target; } extend (ребенок, мама); console.log (ребенок); // Object {name: "zhangzhiying", Lastage: 21, возраст: 22, пол: "Женщина"} Child.lastage = 12; // Результат показывает, что затраты изменяется, что указывает на то, что ребенок. Давайте использовать метод getownpropertydesriptor () для подтверждения <br> console.log (object.geto<Em id = __ mcedel> </script> </em>
Вывод: чтобы достичь наследования, нам все еще нужно решить проблему -> «Наследство» характеристики атрибута.
4. Полная версия
<script type = "text/javascript"> var Child = {}; var mother = {name: "zhangzhiying", lastage: 21, set age (value) {this.lastage = value; }, get age () {return this.lastage+1; }, секс: "женский"}; Object.DefineProperty (мать, "Labage", {writeble: false}); Mother.age = 15; <Span style = "color: #333399"> <strong> function extend (target, source) {var names = object.getownpropertynames (source); // Получить все имена свойств для (var i = 0; i <names.length; i ++) {if (names [i] in target) продолжить; // Если это свойство существует, пропустите (в прототипе наследование, если атрибут собственного свойства и свойство объекта прототипа дублируются, сохраните собственное свойство) var desc = object.getownpropertydescriptor (источник, имена [i]); // Получить объект дескриптора атрибута матери (то есть набор характеристик атрибута, представленного объектом дескриптора в es5) object.defineproperty (Target, names [i], desc); // Получить объект дескриптора матери к определению атрибута ребенка} return Target; } </Strong> </span> extend (ребенок, мать); console.log (ребенок); Child.lastage = 12; console.log (object.getownpropertydescriptor (ребенок, "Lastage")); console.log (ребенок); </script>Окончательные результаты:
Вы можете ясно видеть печать три раза, ребенок «унаследовал», чтобы установить и получить, значение Lastage не изменилось, а записи также является ложным.
Резюме: недавно я читаю «авторитетное руководство по JavaScript». Я суммирую некоторый опыт. Если есть какие -либо ошибки, пожалуйста, поправьте меня, научитесь и продвигайте прогресс вместе ~
Приведенное выше подробное объяснение наследования JavaScript с использованием функций - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.