@Dimka5

Можно ли сделать сеттер и геттер не для свойства объекта а для самого объекта?

Известно как задать геттер и сеттер для свойства объекта, например так

function Osobaya_peremennaya() {} // Класс

Osobaya_peremennaya.prototype = { // Задаём сеттер и геттер
    set znachenie_peremennoy (znachenie) {
        console.log('Любые другие действия');
        this._znachenie_peremennoy = znachenie;
    },
    get znachenie_peremennoy () {
        return this._znachenie_peremennoy;
    }
};

// Использование
prozrachnost          = new Osobaya_peremennaya;
prozrachnost.znachenie = 0.5;

console.log(prozrachnost.znachenie);


Но хотелось бы избежать обращения к свойству и сразу использовать присвоение, то есть вот так
prozrachnost = new Osobaya_peremennaya;
prozrachnost = 0.5;

console.log(prozrachnost);


Зачем это нужно. Например в WebGL что бы передать переменной которую мы указали в шейдере какие то данные нужно написать примерно такую строчку.
webgl_context.uniform1f(webgl_context.getUniformLocation(shader_programm, "prozrachnost"), 0.5);

// Строчка выше смотрится приятнее если она в сеттере
prozrachnost.znachenie = 0.5;

// Можно ли сократить до такой?
prozrachnost = 0.5;


Возможно есть совершенно другое решение?
  • Вопрос задан
  • 370 просмотров
Решения вопроса 2
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Ну можно положить сам объект в window и сделать соответствующие геттер и сеттер.
Object.defineProperty(window, 'prozrachnost', {
    set(value) {
        if (value instanceof Osobaya_peremennaya) {
            window._prozrachnost = value;
        } else {
            window._prozrachnost.znachenie = value;
        }
    },
    
    get() {
        return window._prozrachnost;
    },
});

window.prozrachnost = new Osobaya_peremennaya;
window.prozrachnost = 0.5;

(не пробовал. а если без window. то в строгом режиме не запустится)

Но вообще всю эту геттерно-сеттерную магию не очень весело читать, разгребать и дебажить. Лучше сделайте как Александр посоветовал, он всё правильно сказал.
Ответ написан
@codemafia
Самоотвод
Нет. Вы присваиваете переменной другое значение, теряя экземпляр объекта.
Если нужно сократить запись, напишите метод в объекте, который будет обрабатывать сразу несколько переменных из параметра-объекта.
Как нибудь так:
myshader.someFunc({foo: "This", bar: "works!"})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы