WedX - журнал о программировании и компьютерных науках

Создавайте несколько свойств с одними и теми же геттерами и сеттерами

Проблема

Недавно я написал программу на JavaScript, в которой используется геттеры и сеттеры. Я прочитал документацию MDN по обоим методам, но запутался, пытаясь их использовать.

Вкратце, я просто хочу создать серию похожих свойств, которые будут иметь одинаковые геттеры и сеттеры, но я не хочу переписывать каждый отдельный сеттер и получатель для каждой собственности.

Выполнение

Как было сказано выше, я попытался выполнить следующий код:

var defaultProperty = {
    set: function(val) {
        this.value = val - 1; // Just an example
    },

    get: function() {
        return this.value + 1; // Just an example
    }
};

var myObj = {};
Object.defineProperties(myObj, {
    foo: defaultProperty,
    bar: defaultProperty
});

Затем я присвоил своим свойствам foo и bar новые значения, например:

myObj.foo = 3;
myObj.bar = 7;

И, наконец, я ожидал чего-то вроде этого:

console.log(myObj.foo, myObj.bar);
> 3 7

Но вместо этого я неожиданно получил следующее:

> 7 7

Похоже, что два свойства либо ссылаются на один и тот же адрес памяти, либо используют одни и те же сеттеры / геттеры. Заметив это, я попытался решить проблему и создал каждое свойство отдельно, например:

Object.defineProperties(myObj, {
    foo: {
        set: function(val) {
            this.value = val - 1;
        },

        get: function() {
            return this.value + 1;
        }
    },

    bar: {
        set: function(val) {
            this.value = val - 1;
        },

        get: function() {
            return this.value + 1;
        }
    }
});

Но результат был тот же:

myObj.foo = 3;
myObj.bar = 7;
console.log(myObj.foo, myObj.bar);
> 7 7

Я также пробовал использовать функции __defineSetter__ и __defineGetter__, но результат не изменился.

Мои вопросы

Теперь, после нескольких неудачных попыток решить мои проблемы, мне интересно:

  • Можно ли определить одни и те же сеттеры и геттеры для разных свойств объекта?
  • Если да, то что я делаю не так и почему мои свойства ведут себя так, как будто это одно и то же свойство?
  • Есть ли лучший способ выполнить то, что я пытаюсь сделать (возможно, без написания каждого сеттера и получателя для каждого свойства)?

Ответы:


1

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

Да, хотя, как вы сами убедились, это не рекомендуется.

что я делаю не так и почему мои свойства ведут себя так, как будто они одно и то же?

Поскольку они хранят / получают доступ, значение, которое было установлено / получено, всегда сохраняется в одном и том же свойстве .value вашего объекта: myObj.value == 6, поэтому и myObj.foo, и myObj.bar дают 7.

Есть ли лучший способ выполнить то, что я пытаюсь сделать?

Сохраните значения в переменных области закрытия и используйте функцию для определения свойств:

function makeDefaultProperty(obj, name) {
    var value;
    return Object.defineProperty(obj, name, {
        set: function(val) {
            value = val - 1; // Just an example
        },
        get: function() {
            return value + 1; // Just an example
        }
    });
};

var myObj = {};
makeDefaultProperty(myObj, "foo");
makeDefaultProperty(myObj, "bar");

Конечно, вместо локальной переменной вы можете просто использовать отдельные «внутренние» свойства, а также можете использовать другой способ создания общих сеттеров / получателей с помощью функции. Оба применили:

function defaultProperty(name) {
    return {
        set: function(val) {
            this[name] = val - 1; // Just an example
        },
        get: function() {
            return this[name] + 1; // Just an example
        }
    };
}

var myObj = Object.defineProperties({}, {
    foo: defaultProperty("_foo"),
    bar: defaultProperty("_bar")
});
24.02.2015
  • Что ж, спасибо за подробный и разнообразный ответ, мне действительно очень нравится метод закрытия! 24.02.2015
  • @Thefoureye: Спасибо за ваше редактирование. Я бы поддержал ваш ответ за использование bind, если бы вы его не удалили: - / 24.02.2015
  • Просто чтобы выбрать гнида, операция привязывала value к this, что и приводило к неожиданному результату. Объем this не изменился. Использование вашей функции генератора нарушает область видимости, создавая отдельные ссылки для value. 24.02.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    © 2024 wedx.ru, WedX - журнал о программировании и компьютерных науках
    Для любых предложений по сайту: [email protected]