Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

В чем разница между “с конструктором и без конструктора”

#javascript


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

Пример 1:

var player_1 = {
        name: "robot",
        hitpoints: 100,
        attack_power: 10,
        heal_power: 5
    }
    var player_2 = {
        name: "human",
        hitpoints: 200,
        attack_power: 20,
        heal_power: 20
    }

    var game = {
        attack: function (p1, p2) {
            p2.hitpoints -= p1.attack_power
            console.log("after hit " + p2.name + "have " + p2.hitpoints + " hitpoints")
        },
        heal: function (p) {
            p.hitpoints += p.heal_power
            console.log(p.name + " was heal and now have " + p.hitpoints + " hitpoints")
        }
    }

    game.attack(player_1, player_2)
    game.heal(player_2)


Пример 2:

var game = function(name, hitpoints, attack_power, heal_power) {
        this.name = name
        this.hitpoints = hitpoints
        this.attack_power = attack_power
        this.heal_power = heal_power
    }
    game.prototype.attack = function (opponent) {
        opponent.hitpoints -= this.attack_power
        console.log("after hit " + opponent.name + " have " + opponent.hitpoints
+ " hitpoints")
    }
    game.prototype.heal = function () {
        this.hitpoints += this.heal_power
        console.log(this.name + " was heal and now have " + this.hitpoints + " hitpoints")
    }

    player_1 = new game("robot", 100, 10, 5)
    player_2 = new game("human", 200, 20, 20)

    player_1.attack(player_2)
    player_2.heal()

    


Ответы

Ответ 1



Для комментария слишком много, поэтому напишу полноценный ответ. Дело в том, что первый случай подразумевает, что вы в самой программе сами укажете начальные характеристики. Во втором же их можно считать из файла и как следствие - сама программы будет занимать меньше места. К тому же, если у вас нужно заменить несколько юнитов (по сути, это блок кода в первом случае и вызов конструкотора во втором), то это будет занимать довольно много времени. К тому же можно предусмотреть значения по умолчанию, или, что не особо сложно, даже создать некоторые маски для классов, рас и так далее. Согласитесь, что заменить руками большое количество юнитов в первом случае намного сложнее, чем во втором. К тому же второй случай подразумевает, причём явно, простое добавление новых каких-то параметров для юнитов. Помимо этого во втором случае очень просто будет реализовать взаимодействие между юнитами, соответственно если принимать на вход сами объекты. Как пример, если добавить, например, два параметра: мана и магическая атака, то в первом случае придётся написать дополнительно 8 строк кода, а во втором 6. Если же юнитов будет не 2, а например, 200, то в первом случае нужно написать дополнительно 1604 строки, а во втором будет всего 212. В общем случае, пусть юнитов n, пусть видов комманд k, а характеристик юнита - i. Тогда первый код будет занимать в строках: (2+i)*n+4k, а второй: (2+i)+n+4k. (без учёта самой игры) Очевидно, что второй код будет занимать меньше строк.

Ответ 2



В данном конкретном случае разницы нет, оба примера работают одинаково. Разница появится когда Вам понадобится создать много объектов типа player. Создавая их с помощью конструктора player_1 = new game("name", 100, 10, 5), Вы более-менее гарантируете правильное поведение этих объектов в дальнейшем, например, при вызове фунций attack и heal. В случае использования 1-ого подхода, Вам придется самому обеспечивать правильную инициализацию кождого объекта (следить за тем, чтобы нужные атрибуты были определены и заполнены корректными значениями). Например, если Вы напишете: var player_33 = { name: "human", hitpoints: 200, heal_power: 20 } как сработает game.attack(player_33, player_21)?

Комментариев нет:

Отправить комментарий