Форум программистов, компьютерный форум, киберфорум
JavaScript: Фреймворки
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 07.03.2014
Сообщений: 47
1

Ошибка в наследовании Prototype

25.01.2017, 00:18. Показов 850. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача реализовать от класса родителя наследование двумя видами. Функционально и с помощью прототипов. С переопределением методов(функций). Прототипы работать не хотят, вопрос почему?
Текст программы:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8"> 
<title>07 JavaScript OOP</title>
</head>
<body>
Начало
<script>
 
class Purchase {
     constructor(name, price, amount) {
    this._name = name;
    this._price = price;
    this._amount = amount;
  } 
  //Эти методы нужны для функционального наследования в дальнейшем.
  getCost (){
      return this._price * this._amount;
  } 
 toString (){
    return ('' + this._name + ';' + this._price + ';' + this._amount + ';' + this.getCost());
  }   
 } 
 
 Purchase.prototype.getCost = function getCost(){
    return this._price * this._amount;
  }
  
 Purchase.prototype.toString = function (){
    return ('' + this._name + ';' + this._price + ';' + this._amount + ';' + this.getCost());
  };
 
var Purch1  = new Purchase('T-shot', 120, 3);
 
document.write("<p>This must be T: " + Purch1._name); 
document.write("<p>This must be T: " + Purch1.getCost());
document.write("<p>This must be T: " + Purch1);
 
class StaticDiscPurchase {
     constructor(name, price, amount) {
    this._name = name;
    this._price = price;
    this._amount = amount;
  } 
}  
 
const StaticDiscount = 19;
 
StaticDiscPurchase.prototype = Object.create(Purchase.prototype);
// Пробовал и StaticDiscPurchase.prototype=new Purchase; итог один и тот же.
StaticDiscPurchase.prototype.constructor = StaticDiscPurchase;
 
 /*
StaticDiscPurchase.prototype.getCost = function (){
Purchase.prototype.getCost.apply(this)
    this.getCost() - StaticDiscount;
};
 
StaticDiscPurchase.prototype.toString = function(){
Purchase.prototype.toString.apply(this)
    this.toString() + ";" + StaticDiscount;
};*/
var sDPurchase = new StaticDiscPurchase('L-Shot', 333, 2);
 
document.write("<p>This must be L-Shot: " + sDPurchase._name); 
document.write("<p>This must be L-Shot: " + sDPurchase.getCost());
document.write("<p>This must be L-Shot: " + sDPurchase);    
  
  
  
  
/*
  Все представленное ниже к теме не относится, но является частью программы, буду рад коментариям.
 
 
  class PercentDiscPurchase extends Purchase {
  constructor(name, price, amount, percent) {
    super(name, price, amount);
    this._percent = percent;
  }
 
  getCost() {
    return super.getCost() * (1-this._percent/100);
  }
  
  toString (){
    return super.toString() + ';' + this._percent;
  }   
}
 
 let porshe = new PercentDiscPurchase('Char', 99, 3, 30);
 
 document.write("<p>" + porshe.getCost()); 
 
var purch = [];
purch[0] = new Purchase('Telephone', 430, 1);
purch[1] = new Purchase('Computer', 600, 1);
purch[2] = new Purchase('Table', 78, 2);
purch[3] = new Purchase('Bottle', 5, 14);
 
for (var i = 0; i < purch.length; i++) {
 document.write("<p>" + purch[i]);
} 
 
function makeBuffer() {
    var globCost = 0;
    
     function makeS(somePurch) {
        if (somePurch == undefined) {
         return globCost;
        }   else{
                return globCost = globCost + somePurch;
            }
    };
    
    makeS.reset = function(){
        globCost = 0;
    }
    return makeS;
  }
 
  var makeS = makeBuffer();
 for (i = 0; i < purch.length; i++){ 
  makeS(purch[i].getCost());
  }
  document.write("<p>buffer result: " + makeS() + " "); 
 
purch[4] = new PercentDiscPurchase('Bag', 150, 2, 30);
purch[5] = new PercentDiscPurchase('Pan', 3, 25, 50);
purch[6] = new PercentDiscPurchase('Keyboard', 80, 1, 10);
 
makeS.reset();
 
document.write("<p>New buffer result: " + makeS() + " ");  
 
for (var i = 0; i < purch.length; i++) {
 document.write("<p>" + purch[i]);
} 
 
 for (i = 0; i < purch.length; i++){ 
  makeS(purch[i].getCost());
  }
  
  document.write("<p>New buffer result: " + makeS() + " ");
*/
  
</script>
<p>Конец</p>
</body>
</html>
По наследованию именно классов материала нашел мало, да и как я понимаю все что относится к функциям должно быть справедливо и для классов, так как на одном сайте наткнулся на примерно вот такое:
document.write(typeof Purch1); // function
Справедливо?
И все таки попробовал переписать с классов на функции и все заработало, а в классах пробовал много вариаций и с прототипами беда. То что в prototype все наследуется от объектов знаю, но логической ошибки не вижу.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2017, 00:18
Ответы с готовыми решениями:

Какой из методов рациональнее использовать: Array.prototype.indexOf() или String.prototype.indexOf()
функции передаётся буква алфавита в нижнем регистре и она должна вернуть следующую по очереди букву...

Ошибка function should have a prototype
Здравствуйте форумчане. Вот такой вопрос: писала как-то программу на Borland C++. Всё запускалось,...

Ошибка Function 'rand' should have a prototype
#include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; main() { int i=0; float...

Ошибка при запуске игры Prototype
Здравствуйте! Помогите пожалуйста, у мя при ходе на сером фоне выходит ошибка а это при...

2
2 / 2 / 0
Регистрация: 07.03.2014
Сообщений: 47
31.01.2017, 17:05  [ТС] 2
Итак, решил задачу с наследованием таким образом, может кому поможет:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
function Print(list){
    for (var i = 0; i < list.length; i++) {
        document.write("<p>" + list[i]);
    }
}
 
function CalculaitingGetCost(list) {
    function makeBuffer() {
        var globCost = 0;
 
        function makeS(somePurch) {
            if (somePurch == undefined) {
                return globCost;
            } else {
                return globCost = globCost + somePurch;
            }
        };
        makeS.reset = function () {
            globCost = 0;
        }
        return makeS;
    }
 
    var makeS = makeBuffer();
    for (i = 0; i < list.length; i++) {
        makeS(list[i].getCost());
    }
    document.write("<h2>You would pay: " + makeS().toFixed(2) + "</h2>");
 
    makeS.reset();
}
function Purchase(name, price, amount) {
    this._name = name;
    this._price = price;
    this._amount = amount;
}
 
Purchase.prototype.getCost = function(){
    return this._price * this._amount;
};
 
Purchase.prototype.toString = function (){
    return ('' + this._name + ';' + this._price.toFixed(2) + ';' + this._amount + ';' + this.getCost().toFixed(2));
}
 
var purch = [];
purch[0] = new Purchase('Telephone', 430, 1);
purch[1] = new Purchase('Computer', 600, 1);
purch[2] = new Purchase('Table', 78, 2);
purch[3] = new Purchase('Bottle', 5, 14);
 
Print(purch);
CalculaitingGetCost(purch);
 
 
function PercentDiscPurchase (name, price, amount, percent) {
    Purchase.apply(this, arguments);
    this._percent = percent;
 
    this.getCost = function ()
    {
        return (Purchase.prototype.getCost.apply(this) * (1-this._percent/100));
    }
 
    this.toString = function ()
    {
        return (Purchase.prototype.toString.apply(this) + ";" + this._percent);
    }
}
 
purch[4] = new PercentDiscPurchase('Bag', 120, 2, 30);
purch[5] = new PercentDiscPurchase('Pan', 3, 25, 50);
purch[6] = new PercentDiscPurchase('Keyboard', 80, 1, 10);
 
Print(purch);
CalculaitingGetCost(purch);
 
function StaticDiscPurchase(name, price, amount) {
    Purchase.apply(this, arguments);
    this.staticDiscount = 14;
}
 
StaticDiscPurchase.prototype = Object.create(Purchase.prototype);
StaticDiscPurchase.prototype.constructor = StaticDiscPurchase;
 
StaticDiscPurchase.prototype.getCost = function ()
{
    return (Purchase.prototype.getCost.apply(this) - this.staticDiscount);
}
StaticDiscPurchase.prototype.toString = function ()
{
    return (Purchase.prototype.toString.apply(this) + ";" +this.staticDiscount);
}
 
purch[7] = new StaticDiscPurchase('T-shot', 80, 3);
purch[8] = new StaticDiscPurchase('Ring', 1300, 1);
purch[9] = new StaticDiscPurchase('Schose', 370, 2);
 
Print(purch);
CalculaitingGetCost(purch);
0
Заблокирован
14.02.2017, 02:19 3
Цитата Сообщение от Herasima Посмотреть сообщение
Справедливо?
нет. Функция -- это конструктор класса, а не сам класс.
Цитата Сообщение от Herasima Посмотреть сообщение
По наследованию именно классов материала нашел мало
То наследование, которое реализовано сахарком, не вполне адекватно. Гораздо проще наследовать классы без поддержки нативного Java-like мусора, вроде instanseOf и тд. Вы можете просто создать класс как обычный объект и отнаследоваться от него с помощью Object.create

Что касается вашего кода, Вы что, реально думаете, что кому-то хочется разгребать более 100 строк? Если рассчитываете на помощь, локализуйте проблему, это просто финиш какой-то

Добавлено через 3 минуты
Цитата Сообщение от Herasima Посмотреть сообщение
Функционально
нет никакого "функционального" наследования, это бред сивой кабылы

Добавлено через 22 минуты
Цитата Сообщение от Herasima Посмотреть сообщение
document.write
а document.write использовать не надо, он может вам перерисовать всю страницу в рантайме. Используйте для тестирования что-нибудь другое, хотя бы алерты или console.log
0
14.02.2017, 02:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2017, 02:19
Помогаю со студенческими работами здесь

Ошибка в наследовании
Столкнулся с такой проблемой: Error:(375, 13) java: constructor Canvas6 in class Canvas6 cannot be...

Ошибка в наследовании
Всем привет. Есть такой код: #include &lt;iostream&gt; using namespace std; class A { public :...

Ошибка в наследовании
Появилась проблема в наследовании с использованием виртуальных методов. Если записать код вот так,...

Ошибка при наследовании
Вот такой код: class Figure2 { protected: int Color; int CenterX; int CenterY; public:

Ошибка при наследовании
Имеется архитектура вида: класс &quot;человек&quot;, от него производные &quot;препод&quot; и &quot;член приемной комиссии&quot;....

Ошибка в наследовании классов
есть 2 класса , один должен наследовать другой вот первый класс struct people { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru