Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 01.10.2015
Сообщений: 28
1

При инициализации почему-то во все объекты записываются данные последнего

04.08.2018, 11:56. Показов 860. Ответов 2
Метки нет (Все метки)

Решил я немного разобраться с наследованием в JS, что то смог более менее понять сам, а что то не получается никак.
Вот возникла проблема, создаю фабрику объектов Animal с двумя приватными переменными, и фабрику Cat.
После чего записываю в конструктор фабрики Cat экземпляр объекта Animal и проверяю что получилось.
Вроде бы всё работает, у экземпляров объекта Cat есть доступ ко всем методам Animal, НО при инициализации почему то во все объекты записываются данные последнего, вот код...
Javascript
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
function Animal () {
    var name = "";
    var coordinates = {x: 0, y: 0};
 
    this.setName = function (value) {
        name = value;
    }
    this.setCoordinates = function (value) {
        coordinates.x = value.x;
        coordinates.y = value.y;
    }
    this.getName = function () {
        return name;
    }
    this.getCoordinates = function () {
        return coordinates;
    }
 
    this.init = function (data) {
        this.setName(data.name);
        this.setCoordinates(data.pos);
    };
} // главный конструктор
 
function Cat (data) {
    var color = data.color;
 
    this.getColor = function () {return color;}
    this.setColor = function (value) {color = value;}
 
    this.printInfo = function () {
        var c = this.getCoordinates();
        console.log("Кот - " + this.getName());
        console.log("В точке - x: " + c.x + " y: " + c.y);
        console.log("Цвет - " + this.getColor());
        console.log("______________________");
    }
 
    this.init(data);
} // конструктор наследник
Cat.prototype = new Animal();
 
var cat_1 = new Cat({pos: {x: 100, y: 100}, name: "Снежок", color: "Белый"}), 
    cat_2 = new Cat({pos: {x: 150, y: 150}, name: "Кружок", color: "Серый"}), 
    cat_3 = new Cat({pos: {x: 200, y: 200}, name: "Пушок",  color: "Рыжий"});
 
// вот собственно и результат
cat_1.printInfo(); // Кот - Пушок / В точке - x: 200 y: 200 / Цвет - Белый
cat_2.printInfo(); // Кот - Пушок / В точке - x: 200 y: 200 / Цвет - Серый
cat_3.printInfo(); // Кот - Пушок / В точке - x: 200 y: 200 / Цвет - Рыжий
// почему то приватные переменные объявленные в Animal записываются не так как мне надо
1) Пожалуйста объясните как исправить?
2) Как сделать так, что бы данные для каждого объекта при создании записывались правильно?

Только если можно, пожалуйста попроще и желательно с парочкой маленьких примеров, я всё таки только учусь, трудно некоторые вещи пока что даются.
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2018, 11:56
Ответы с готовыми решениями:

не записываются данные при отправке запроса почему
1.php <!DOCTYPE html> <html lang="ru"> <head> <title>Заголовок</title> </head> <body> ...

В буфер выбора записываются все объекты из стека имен
Здравствуйте, есть вопрос не дающий покоя. Вроде все правильно, но работает не корректно. Есть...

Почему лучше инициализировать объекты класса во время инициализации конструктора?
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

Не могу понять почему данные не записываются в БД
Есть форма: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"...

2
Модератор
771 / 352 / 142
Регистрация: 17.07.2013
Сообщений: 992
05.08.2018, 14:13 2
Лучший ответ Сообщение было отмечено Arhitector как решение

Решение

В функции Animal вы создаете замыкание для переменных name, coordinates, проблема в том, что замыкание это используется для всех экземпляров Cat, потому что вы поместили экземпляр Animal в прототип. Следовательно экземпляры Cat обращаются к одним и тем же переменным, отсюда и результат

Динамически присваивайте прототип при создании экземпляра Cat

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Cat (data) {
    var color = data.color;
 
    // создаем ссылку на прототип вот так
    this.__proto__ = new Animal();
    this.getColor = function () {return color;}
    this.setColor = function (value) {color = value;}
 
    this.printInfo = function () {
        var c = this.getCoordinates();
        console.log("Кот - " + this.getName());
        console.log("В точке - x: " + c.x + " y: " + c.y);
        console.log("Цвет - " + this.getColor());
        console.log("______________________");
    }
 
    this.init(data);
}
2
0 / 0 / 1
Регистрация: 01.10.2015
Сообщений: 28
05.08.2018, 15:03  [ТС] 3
Действительно работает, большое спасибо! Буду потихоньку пытаться осмыслять.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2018, 15:03

Записываются не все данные
Всем привет. Пишу класс, который подключается к БД и записывает в нее информацию. В моей таблице 3...

не все данные записываются в файл
Вот есть главная страничка <?php header("Content-Type: text/html; cahrset=utf-8"); function...

В массиве объектов класса все объекты заполняются данными последнего
Есть задача: напишите программу, которая может выводить список членов по реальным именам,...

Файл: Не могу понять, почему данные не записываются в файл, он остается пустым.
Здравствуйте , помогите пожалуйста , с записью данных в файл. #include "stdafx.h"...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.