Статьи

Объект ()

Используя встроенную функцию конструктора Object (), мы можем создавать общие пустые объекты на лету. На самом деле, если вы вспомните начало главы 1, это именно то, что мы сделали, создав объект Cody. Позволяет воссоздать объект Коди.

Образец: sample69.html

01
02
03
04
05
06
07
08
09
10
11
<!DOCTYPE html><html lang=»en»><body><script>
 
    var cody = new Object();
 
    for (key in cody) { // Confirm that cody is an empty generic object.
        if (cody.hasOwnProperty(key)) {
            console.log(key);
        }
    }
 
</script></body></html>

Здесь все, что мы делаем, это используем функцию конструктора Object() для создания универсального объекта с именем cody. Вы можете думать о конструкторе Object() как обрезчике файлов cookie для создания пустых объектов, у которых нет предопределенных свойств или методов (за исключением, конечно, объектов, унаследованных от цепочки прототипов).

Если это не очевидно, конструктор Object() является объектом. То есть функция конструктора основана на объекте, созданном из конструктора Function . Это может сбивать с толку. Просто помните, что, как и конструктор Array конструктор Object просто выплевывает пустые объекты. И да, вы можете создавать все пустые объекты, которые вам нравятся. Однако создание пустого объекта, такого как cody, сильно отличается от создания собственной функции конструктора с предопределенными свойствами. Убедитесь, что вы понимаете, что cody — это просто пустой объект, основанный на конструкторе Object() . Чтобы действительно использовать возможности JavaScript, вам нужно научиться не только создавать пустые контейнеры Object() из Object() , но и создавать собственный «класс» объектов ( Person() ), например функцию конструктора Object() сам.


Функция конструктора Object() принимает один необязательный параметр. Этот параметр является значением, которое вы хотели бы создать. Если вы не укажете параметр, то будет принято null или undefined значение.

Образец: sample70.html

01
02
03
04
05
06
07
08
09
10
<!DOCTYPE html><html lang=»en»><body><script>
 
    // Create an empty object with no properties.
    var cody1 = new Object();
    var cody2 = new Object(undefined);
    var cody3 = new Object(null);
 
    console.log(typeof cody1, typeof cody2, typeof cody3);
 
</script></body></html>

Если значение, кроме null или undefined , передается в конструктор Object , переданное значение будет создано как объект. Таким образом, теоретически мы можем использовать конструктор Object() для создания любых других нативных объектов, которые имеют конструктор. В следующем примере я делаю именно это.

Образец: sample71.html

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<!DOCTYPE html><html lang=»en»><body><script>
 
    /* Use the Object() constructor to create string, number, array, function, Boolean, and regex objects.
 
    // The following logs confirm object creation.
    console.log(new Object(‘foo’));
    console.log(new Object(1));
    console.log(new Object([]));
    console.log(new Object(function () { }));
    console.log(new Object(true));
    console.log(new Object(/\bt[az]+\b/));
 
    /* Creating string, number, array, function, Boolean, and regex object instances via the Object() constructor is really never done.
 
</script></body></html>

Object() имеет следующие свойства (не включая унаследованные свойства и методы):

Свойства ( Object.prototype; ):


Экземпляры объекта Object() имеют следующие свойства и методы (не включая унаследованные свойства и методы):

Свойства экземпляра ( var myObject = {}; myObject.constructor; ):

Методы экземпляра ( var myObject = {}; myObject.toString(); ):

Цепочка прототипов заканчивается Object.prototype , и, таким образом, все свойства и методы Object() наследуются всеми объектами JavaScript.


Создание «литерала объекта» влечет за собой создание объекта со свойствами или без свойств с помощью фигурных скобок ( var cody = {}; ). Помните в начале главы 1, когда мы создавали одноразовый объект cody, а затем задавали свойства объекта cody с помощью точечной нотации? Давайте сделаем это снова.

Образец: sample72.html

01
02
03
04
05
06
07
08
09
10
11
<!DOCTYPE html><html lang=»en»><body><script>
 
    var cody = new Object();
    cody.living = true;
    cody.age = 33;
    cody.gender = ‘male’;
    cody.getGender = function () { return cody.gender;
 
    console.log(cody);
 
</script></body></html>

В коде обратите внимание, что для создания объекта cody и его свойств cody пять операторов. Используя cody объекта, мы можем выразить один и тот же объект cody в одном выражении.

Образец: sample73.html

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<!DOCTYPE html><html lang=»en»><body><script>
 
    var cody = {
        living: true,
        age: 23,
        gender: ‘male’,
        getGender: function () { return cody.gender;
    };
    // Notice the last property has no comma after it.
 
    console.log(cody);
 
</script>
</body>

Использование буквенной нотации дает нам возможность создавать объекты, включая определенные свойства, с меньшим количеством кода и визуально инкапсулировать связанные данные. Обратите внимание на использование операторов : и , в одном выражении. Это на самом деле предпочтительный синтаксис для создания объектов в JavaScript из-за его краткости и удобочитаемости.

Вы должны знать, что имена свойств также могут быть указаны в виде строк:

Образец: sample74.html

01
02
03
04
05
06
07
08
09
10
11
12
13
<!DOCTYPE html><html lang=»en»><body><script>
 
    var cody = {
        ‘living’: true,
        ‘age’: 23,
        ‘gender’: ‘male’,
        ‘getGender’: function () { return cody.gender;
    };
 
    console.log(cody);
 
</script>
</body>

Нет необходимости указывать свойства в виде строк, если только не указано имя свойства:

  • Является одним из зарезервированных ключевых слов ( class ).
  • Содержит пробелы или специальные символы (любые, кроме цифр, букв, знака доллара ($) или символа подчеркивания (_)).
  • Начинается с номера.

Осторожный! Последнее свойство объекта не должно иметь запятой. Это приведет к ошибке в некоторых средах JavaScript.


Функция конструктора Object() в JavaScript является особенной, поскольку ее свойство prototype является последней остановкой в ​​цепочке прототипов.

В следующем примере я расширяю Object.prototype свойством foo а затем создаю строку и пытаюсь получить доступ к свойству foo как если бы это было свойство экземпляра строки. Так как экземпляр myString не имеет свойства foo , включается цепочка прототипов, и значение String.prototype в String.prototype . Его там нет, поэтому следующим местом для поиска является Object.prototype , который является конечным местоположением, в котором JavaScript будет искать значение объекта. Значение foo найдено, потому что я его добавил, поэтому оно возвращает значение foo .

Образец: sample75.html

01
02
03
04
05
06
07
08
09
10
11
12
<!DOCTYPE html><html lang=»en»><body><script>
 
    Object.prototype.foo = ‘foo’;
 
    var myString = ‘bar’;
 
 
    // Logs ‘foo’, being found at Object.prototype.foo via the prototype chain.
    console.log(myString.foo);
 
</script>
</body>

Осторожный! Все, что добавлено в Object.prototype будет отображаться for in цикле for и в цепочке прототипов. Из-за этого было сказано, что изменение Object.prototype запрещено.