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

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

04.08.2018, 11:56. Показов 1101. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2018, 11:56
Ответы с готовыми решениями:

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

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

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

2
Модератор
 Аватар для Thisman
771 / 352 / 142
Регистрация: 17.07.2013
Сообщений: 992
05.08.2018, 14:13
Лучший ответ Сообщение было отмечено 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  [ТС]
Действительно работает, большое спасибо! Буду потихоньку пытаться осмыслять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2018, 15:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru