Выразительный JavaScript (Хавербеке) - страница 59

.

>console.log(Object.getPrototypeOf({}) == Object.prototype);

>// → true

>console.log(Object.getPrototypeOf(Object.prototype));

>// → null

Как и следовало ожидать, функция >Object.getPrototypeOf возвращает прототип объекта.

Прототипические отношения в JavaScript выглядят как дерево, в корне которого находится >Object.prototype. Он предоставляет несколько методов, которые появляются у всех объектов. Например, >toString, который преобразует объект в строковый вид.

Прототипом многих объектов служит не непосредственно >Object.prototype, а какой-то другой объект, который предоставляет свои свойства по умолчанию. Функции происходят от >Function.prototype, массивы – от >Array.prototype.

>console.log(Object.getPrototypeOf(isNaN) == Function.prototype);

>// → true

>console.log(Object.getPrototypeOf([]) == Array.prototype);

>// → true

У таких прототипов будет свой прототип – часто >Object.prototype, поэтому он всё равно, хоть и не напрямую, предоставляет им методы типа >toString.

Функция >Object.getPrototypeOf возвращает прототип объекта. Можно использовать >Object.create для создания объектов с заданным прототипом.

>var protoRabbit = {

>  speak: function(line) {

>    console.log("А " + this.type + " кролик говорит '" + line + "'");

>  }

>};

>var killerRabbit = Object.create(protoRabbit);

>killerRabbit.type = "убийственный";

>killerRabbit.speak("ХРЯЯЯСЬ!");

>// → А убийственный кролик говорит 'ХРЯЯЯСЬ!'

Прото-кролик работает в качестве контейнера свойств, которые есть у всех кроликов. Конкретный объект-кролик, например убийственный, содержит свойства, применимые только к нему – например, свой тип – и наследует разделяемые с другими свойства от прототипа.

Конструкторы

Более удобный способ создания объектов, наследуемых от некоего прототипа – конструктор. В JavaScript вызов функции с предшествующим ключевым словом >new приводит к тому, что функция работает как конструктор. Конструктор создает новый объект и возвращает его, если только явно не задано возвращение другого объекта вместо созданного. При этом свежесозданный объект доступен изнутри конструктора через переменную >this.

Говорят, что объект, созданный при помощи >new, является экземпляром конструктора.

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

>function Rabbit(type) {

>  this.type = type;

>}


>var killerRabbit = new Rabbit("убийственный");

>var blackRabbit = new Rabbit("чёрный");

>console.log(blackRabbit.type);

>// → чёрный

Конструкторы (а вообще-то, и все функции) автоматически получают свойство под именем