fork(2) download
  1. >>393107
  2.  
  3. >>var constructor = this.constructor;
  4. >Что это за ерунда?
  5.  
  6. Я имел в виду, в глобальном коде this = window. Соответственно ты пишешь var constructor = window.constructor и эта строчка не имеет никакого смысла.
  7.  
  8. this вообще имеет смысл только внутри функций использовать.
  9.  
  10. > Мне прописывать alert(имяЭлемента.constructor) каждый раз после создания нового элемента? После примера там написано, что такая строка ставит правильное значение prototype.constructor.
  11. Во-первых, зачем нам alert когда есть console.log? Во-вторых, вот эта функция extend, которая там описывается, она делает одну вещь: настраивает цепочку прототипов чтобы у созданного объекта она выглядела так:
  12.  
  13. объект -> Child -> Parent
  14.  
  15. (здесь Child — это класс унаcледованный от Parent c помощью описанной там функции extend).
  16.  
  17. Но способ, там используется, довольно-таки костыльный (мы создаем пустую функцию и меняем ее свойство prototype). В ES5 (который поддерживается новыми браузерами) есть более простой способ, это такой код:
  18.  
  19. Child.prototype = Object.create(Parent.prototype);
  20.  
  21. Соответственно при использовании Object.create пляски с new F() не нужны.
  22.  
  23. > Мне в конструкторе каждого объекта это прописывать?
  24. Да. Надо писать что-то вроде
  25.  
  26. function Child() {
  27. Parent.call(this);
  28. .....
  29. }
  30.  
  31. > А, например, в конструкторе электросети один раз это прописать нельзя?
  32. Нельзя, конечно. В JS так делается наследование — ты должен явно вызвать конструктор предка, иначе его никто не вызовет.
  33.  
  34. > return "Не покупать! Не хватит: " + balance;
  35. Ох, вот это не очень правильно, возвращать результат в человекочитаемой форме. Представь, что мы хотим использовать твой класс из другой программы и хотим там делать что-то в зависимости от того, хватит нам энергии или нет:
  36.  
  37. var result = electricNet.calcPrice();
  38. if (????) {
  39. alert("Внимание! Не удалось закупить достаточно энергии!");
  40. }
  41.  
  42. Что мы должны написать в if? Твое текстовое сообщение очень трудно использовать в программе. Лучше было бы вернуть данные в машинночитаемом виде:
  43.  
  44. return {
  45. buy: 100500, // куплено энергии на сумму
  46. sell: 0, // продано
  47. isBalanced: true, // сведен ли баланс
  48. extraEnergy: 0, // сколько энергии не удалось продать
  49. missingEnergy: 0, // дефицит энергии
  50. };
  51.  
  52. Соответственно такие данные мы легко можем проверить:
  53.  
  54. if (!result.isBalanced) {
  55. alert("!!!!");
  56. }
  57.  
  58. > return powerline2 - powerline1;
  59. Неправильно, нельзя вычитать объекты, надо писать что-то вроде powerline1.power - powerlin2.power;
  60.  
  61.  
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
>>393107

>>var constructor = this.constructor;
>Что это за ерунда? 

Я имел в виду, в глобальном коде this = window. Соответственно ты пишешь var constructor = window.constructor и эта строчка не имеет никакого смысла.

this вообще имеет смысл только внутри функций использовать.

> Мне прописывать alert(имяЭлемента.constructor) каждый раз после создания нового элемента? После примера там написано, что такая строка ставит правильное значение prototype.constructor.
Во-первых, зачем нам alert когда есть console.log? Во-вторых, вот эта функция extend, которая там описывается, она делает одну вещь: настраивает цепочку прототипов чтобы у созданного объекта она выглядела так: 

объект -> Child -> Parent 

(здесь Child — это класс унаcледованный от Parent c помощью описанной там функции extend).

Но способ, там используется, довольно-таки костыльный (мы создаем пустую функцию и меняем ее свойство prototype). В ES5 (который поддерживается новыми браузерами) есть более простой способ, это такой код: 

Child.prototype = Object.create(Parent.prototype);

Соответственно при использовании Object.create пляски с new F() не нужны.

> Мне в конструкторе каждого объекта это прописывать? 
Да. Надо писать что-то вроде 

function Child() {
Parent.call(this);
.....
}

> А, например, в конструкторе электросети один раз это прописать нельзя?
Нельзя, конечно. В JS так делается наследование — ты должен явно вызвать конструктор предка, иначе его никто не вызовет.

> return "Не покупать! Не хватит: " + balance;
Ох, вот это не очень правильно, возвращать результат в человекочитаемой форме. Представь, что мы хотим использовать твой класс из другой программы и хотим там делать что-то в зависимости от того, хватит нам энергии или нет:

var result = electricNet.calcPrice();
if (????) {
alert("Внимание! Не удалось закупить достаточно энергии!");
}

Что мы должны написать в if? Твое текстовое сообщение очень трудно использовать в программе. Лучше было бы вернуть данные в машинночитаемом виде: 

return {
buy: 100500, // куплено энергии на сумму
sell: 0, // продано
isBalanced: true, // сведен ли баланс
extraEnergy: 0, // сколько энергии не удалось продать
missingEnergy: 0, // дефицит энергии
};

Соответственно такие данные мы легко можем проверить: 

if (!result.isBalanced) {
alert("!!!!");
}

> return powerline2 - powerline1;
Неправильно, нельзя вычитать объекты, надо писать что-то вроде powerline1.power - powerlin2.power;