Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
107 / 4 / 1
Регистрация: 04.04.2015
Сообщений: 124

Setter / Getter

18.01.2019, 05:33. Показов 2474. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите как сделать.
Вот пример кода.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Obj {
    constructor () {
        this._position = {'x':0,'y':0,'z':0};
    }
 
    set position (value) {
        this._position = value;
        console.log('YES');
    }
 
    get position () {
        return this._position;
    }
}
 
 
var o1 = new Obj();
o1.position = {'x':10,'y':0,'z':0}
console.log(o1.position);
 
var o2 = new Obj();
o2.position.x = 10;
console.log(o2.position);
Я создаю 2 объекта.
В первом я заменяю все координаты, и в консоль выводится YES. потом получаю новые координаты.
Во втором заменяю координату только для x, в таком случае YES уже не выводится, и потом получаю новые координаты.

и в 1 и 2 случаю, результат будет один - {'x':10,'y':0,'z':0}, но во 2 случае сеттер не срабатывает... как можно сделать чтобы он тоже срабатывал?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2019, 05:33
Ответы с готовыми решениями:

Копирование Getter из одного объекта в другой
Уважаемые, у меня есть 2 объекта import * as mutations from './mutations' import * as forms from './../forms/mutations' {...

Getter and setter
Не могу получить значения. Правильно ли я делаю? Здесь геттер и сеттер package mainPackage; public class Calculator { ...

Getter Setter
class point { private: int x; int y; public: int getX() { return x;

7
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.01.2019, 08:49
Лучший ответ Сообщение было отмечено SkyWeb как решение

Решение

Добрый день.
Если сильно упростить задачу, то можно реакцию поставить просто на каждый сеттер _position.
И кстати - JSON-нотацию можно и не использовать.
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
        class Obj {
            constructor() {
                this._position = {
                    get x() { return this._x; },
                    set x(value) { this._x = value; console.log('YES'); },
                    get y() { return this._y; },
                    set y(value) { this._y = value; console.log('YES'); },
                    get z() { return this._z; },
                    set z(value) { this._z = value; console.log('YES'); }
                };
                this.position._x = 0;
                this.position._y = 0;
                this.position._z = 0;
            }
 
            set position(value) {
                this._position.x = value.x;
                this._position.y = value.y;
                this._position.z = value.z;
            }
 
            get position() {
                return this._position;
            }
        }
        let o1 = new Obj();
        console.log(o1.position);
        o1.position = { x: 10, y: 0, z: 0 };
        console.log(o1.position);
 
        let o2 = new Obj();
        o2.position.x = 10;
        console.log(o2.position);
(Добавил инициализацию _position нулями.)
1
107 / 4 / 1
Регистрация: 04.04.2015
Сообщений: 124
18.01.2019, 09:26  [ТС]
amr-now Спасибо большое, очень помогли. Только тут в одном случае получается position.x а в другом position._x но это я исправил. Всю ночь не мог разобраться, еще раз огромное спасибо.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.01.2019, 09:46
SkyWeb, position._x можно использовать в обход геттера/сеттера.
0
107 / 4 / 1
Регистрация: 04.04.2015
Сообщений: 124
18.01.2019, 09:49  [ТС]
Ну я сделал как мне нужно )),,.. вот, если конечно тут понятно что я делаю ))

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class Object3D {
    constructor (geometry, material) {
        var obj = Object.assign(geometry,material);
        var _this = this;
        
        this.vertexs = obj.vertexs;
        this.indices = obj.indices;
        this.colors = obj.colors;
                
        this._position = {
            'px':0, 'py':0, 'pz':0,         
            get x() { return this.px; },
            set x(value) { this.px = value; _this.matrix = new Matrix4().translate(_this.matrix,_this._position); },
            get y() { return this.py; },
            set y(value) { this.py = value; _this.matrix = new Matrix4().translate(_this.matrix,_this._position); },
            get z() { return this.pz; },
            set z(value) { this.pz = value; _this.matrix = new Matrix4().translate(_this.matrix,_this._position); }
        };
        this._rotate = {
            'rx':0, 'ry':0, 'rz':0,         
            get x() { return this.rx; },
            set x(value) { this.rx = value; _this.matrix = new Matrix4().rotate(_this.matrix,_this._rotate); },
            get y() { return this.ry; },
            set y(value) { this.ry = value; _this.matrix = new Matrix4().rotate(_this.matrix,_this._rotate); },
            get z() { return this.rz; },
            set z(value) { this.rz = value; _this.matrix = new Matrix4().rotate(_this.matrix,_this._rotate); }
        };
 
        this.matrix = new ASTRA.Matrix4().create();
        this.shader = new ASTRA.Shader();
        
        var colorBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.colors), gl.STATIC_DRAW);
        gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
        
        var vertexBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.vertexs), gl.STATIC_DRAW);
        gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, 0);
 
        var indexBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(this.indices), gl.STATIC_DRAW);
 
        return this;
    }
    
    set position(value) {
        this._position.px = value[0];
        this._position.py = value[1];
        this._position.pz = value[2];
        this.matrix = new Matrix4().translate(this.matrix,this._position);
    }
 
    get position() {
        return this._position;
    }
    
    set rotate(value) {
        this._rotate.rx = value[0];
        this._rotate.ry = value[1];
        this._rotate.rz = value[2];
        this.matrix = new Matrix4().rotate(this.matrix,this._rotate);
    }
 
    get rotate() {
        return this._rotate;
    }
    
 
}
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.01.2019, 14:56
SkyWeb, раз уж взялись за классы, используйте современный синтаксис.
var - грязный хак из древней версии JS. Правильно - let.

Добавлено через 4 часа 53 минуты
Цитата Сообщение от SkyWeb Посмотреть сообщение
this._position = {
'px':0, 'py':0, 'pz':0,
Спасибо за напоминание.
Литерал объекта поразительно похож на объявление класса, но присутствуют малозаметные отличия.
В литерале объекта можно объявлять свойства-значения,
а в объявлении класса принципиально нельзя объявлять свойства-значения вне членов-функций.

JavaScript
1
2
this._position = {
     _x:0, _y:0, _z:0,
Не используйте зря JSON-нотацию.
"Приватные поля" именуются с нижнего подчеркивания.
0
107 / 4 / 1
Регистрация: 04.04.2015
Сообщений: 124
18.01.2019, 15:39  [ТС]
Спасибо.
Переделал на _x:0, _y:0, _z:0, Супер.

"Приватные поля" именуются с нижнего подчеркивания. - Это как негласное правило?, правило хорошего тонна?

По поводу let, на сколько я помню переменные объявленные через let действуют в рамках {}, то есть за ними он не работает.
Переделаю потом.

У меня сейчас задача сделать чтобы этот класс наследовал класс где все будет описано про позицию. И потом класс камеры также. А то сейчас тут вношу правки и тоже самое в другом файле где я камеру описывал.

Давно уже серьезно за WebGl хотел взяться. Много нового для себя открыл. Многие пишут что зачем велосипед изобретать, уже есть готовые библиотеки (threejs например для работы с webgl), но кто-бы что там не говорил, создавать свой велосипед полезно, интересно да и опыт большой. Жаль что в рунете не так много полезной информации по нативному webgl (по webgl 2.0 так вообще ничего нет), все уперлись в эти готовые движки и куча информации которая не уходит дальше hello world. И английский за одно подтягиваю )))
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,983
Записей в блоге: 239
21.01.2019, 23:58
Цитата Сообщение от SkyWeb Посмотреть сообщение
Давно уже серьезно за WebGl хотел взяться. Много нового для себя открыл. Многие пишут что зачем велосипед изобретать, уже есть готовые библиотеки (threejs например для работы с webgl), но кто-бы что там не говорил, создавать свой велосипед полезно, интересно да и опыт большой. Жаль что в рунете не так много полезной информации по нативному webgl (по webgl 2.0 так вообще ничего нет), все уперлись в эти готовые движки и куча информации которая не уходит дальше hello world. И английский за одно подтягиваю )))
I am learning English too. WebGL 2.0 is not supported on all browsers. But I study 2.0. We can study WebGL 2.0 with OpenGL ES 3.0 books. You can use books about OpenGL ES 2.0 for learning WebGL 1.0. It is simple to translate examples from OpenGL to WebGL. Yes, it is nessasary to learn English because the most of information is in English. WebGL documentation is in English. I like study Three.js, Babylon.js, Pixi.js and Phaser.js. But I study how to build my own game engine too. I want to study how to write shaders in GLSL + math. I like this book: Build your own 2D Game Engine and Create Great Web Games Using HTML5, JavaScript, and WebGL

These general lessons are good for start:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.01.2019, 23:58
Помогаю со студенческими работами здесь

вопрос о getter\setter
дан код, который трактуется как образец. class Foo { Value field_; public: // функция 1 Value& field() { ...

Auto-generator Of Getter/setter
Доброе время суток, Уважаемые форумчане! Данная утилита облегчает рутинную работу по созданию приватных переменных и последующую...

Почитать о Generic и Getter\Setter
Где можно почитать о Generic и Getter\Setter? Добавлено через 18 минут Почитать об этом*

Добавить корректные getter и setter-методы
Здравствуйте. Подскажите пожалуйста по вопросу: Задание по теме "работа со строками и регулярные выражения". Задание: В Java...

Объясните назначение Setter, Getter, Deleter
Можете объяснить зачем они нужны или же дайте ссылку на нормальный ресурс. После C++ очень тяжело понять ООП python, особенно не понятно с...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru