Как мне провести рефакторинг обновления свойств объекта? - PullRequest
0 голосов
/ 05 июля 2011

У меня есть объект JavaScript, эти свойства в основном статические. Они могут быть определены во время строительства. Однако я также добавил метод morph, который изменяет состояние объекта. Таким образом, эти свойства должны измениться вместе с ним.

Ниже я успешно закодировал его как метод (longNameMethod, без проблем) и как свойство (longNameProperty, проблемный). Проблема с longNameProperty заключается в том, что в конструкторе и в методе morph есть код, который выглядит очень похоже. Есть ли способ устранить это дублирование?

var Fruit = function (name) {
    this.name = name;

    this.longNameMethod = function () {
        return this.name + this.name;
    }

    this.longNameProperty = this.name + this.name;

    this.morph = function(name) {
        this.name = name;

        // starting to feel redundant
        this.longNameProperty = this.name + this.name;
    }

    // update(); // hypothetical solution
};

var item = new Fruit('apple');

console.log(item.longNameMethod()); // apple apple
console.log(item.longNameProperty); // apple apple

item.morph('orange');

console.log(item.longNameMethod()); // orange orange
console.log(item.longNameProperty); // orange orange

Я попытался включить метод "update", который бы обрабатывал обновление всех этих свойств, но по какой-то причине я не могу использовать его во время конструирования. Это говорит о том, что this.name не определено. Что там с порядком операций при строительстве?

Редактировать: Так что да, методический подход и подход с использованием свойств функционально идентичны внешним, но цель состоит в том, чтобы использовать подход с использованием свойств.

Редактировать ^ 2: Так что я думаю, что есть несколько проблем в игре ... Одна из которых объясняется здесь: Как работает ключевое слово "this" в функции?

1 Ответ

1 голос
/ 05 июля 2011

Вам необходимо добавить метод перед его использованием, когда вы назначаете его в this:

var Fruit = function (name) {
    this.morph = function(name) {
        this.name = name;

        this.longNameProperty = this.name + this.name;
    }

    this.morph(name);
};

var item = new Fruit('apple');

console.log(item.longNameProperty); // apple apple

item.morph('orange');

console.log(item.longNameProperty); // orange orange
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...