Читать «Изучаем программирование на JavaScript» онлайн - страница 324

Unknown

}

}

Секрет этой игры: при достижении

}

уровня 42 в прототип добавляется

новый метод. Это означает, что

function Robot(name, year, owner) {

все роботы наследуют способность

this.name = name;

применения лазеров!

this.year = year;

this.owner = owner;

}

var game = new Game();

var robby = new Robot("Robby", 1956, "Dr. Morbius");

var rosie = new Robot("Rosie", 1962, "George Jetson");

while (game.level < 42) {

game.play();

}

robby.deployLaser();

rosie.deployLaser();

дальше 4 633

решение упражнения

v

Мы встроили в наших роботов Робби и Рози новую функцию: теперь они могут сообщать о возникающих

ошибках при помощи метода reportError. Проанализируйте приведенный ниже код, обращая особое

внимание на то, откуда этот метод получает информацию об ошибках и откуда берется эта информация:

из прототипа или экземпляра.

Ниже приведено наше решение.

function Robot(name, year, owner) {

this.name = name;

this.year = year;

this.owner = owner;

}

Метод reportError

ет

только использу

Robot.prototype.maker = "ObjectsRUs";

значение errorMessage,

е-

Robot.prototype.errorMessage = "All systems go.";

поэтому он не пер

определяет свойство.

Robot.prototype.reportError = function() {

console.log(this.name + " says " + this.errorMessage);

};

Метод spillWater присва-

Robot.prototype.spillWater = function() {

ивает новое значение this.

errorMessage, что приво-

this.errorMessage = "I appear to have a short circuit!"; дит к переопределению

};

свойства в прототипе

для любого робота, вы-

зывающего этот метод.

var robby = new Robot("Robby", 1956, "Dr. Morbius");

var rosie = new Robot("Rosie", 1962, "George Jetson");

rosie.reportError();

robby.reportError();

Мы вызываем метод spillWater для

robby.spillWater();

объекта robby. Так Робби получает

rosie.reportError();

собственное свойство errorMessage,

которое переопределяет свойство

robby.reportError();

в прототипе.

console.log(robby.hasOwnProperty("errorMessage"));

true

console.log(rosie.hasOwnProperty("errorMessage"));

false

Но метод spillWater никогда не вызыва-

ется для Рози, поэтому она наследует

свойство от прототипа.

634 глава 13

использование прототипов

Развлечения с магнитами. Решение

Мы выложили на холодильнике очередную диаграмму объектов, и снова кто-то все перепутал.

Снова! Сможете ли вы расставить магниты по местам? Нам понадобится новая линейка косми-

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

деляют метод speak обычных роботов, а также расширяют функциональность роботов новым

свойством homePlanet. Ниже приведено наше решение.

function speak() {

// code to speak

Прототип Robot

}

maker: "ObjectsRUs"

function

makeCoffee() {

speak()

// code 4 coffee

}

makeCoffee()

function

blinkLights()

blinklights() {

Прототип

-

// code 4 lights

}

SpaceRobot насле

-

дует (и расши

ряет) прототип

Robot. Мы добавили

в этот прототип

два метода — speak

-

и pilot, которые бу

Robot

дут наследоваться

Прототип SpaceRobot

function speak() {

всеми роботами.

name: "Robby"

// code to speak