У меня есть планета "класс" в JavaScript. Когда пользователь нажимает на холст html5, вызывается соответствующая функция manageClick планеты, которая должна изменить содержимое определенного элемента div. Содержание должно измениться на кнопку. Если пользователь щелкает по нему, то должна вызываться функция планеты createShip.

Теперь вопрос в том, как мне передать ссылку на саму планету? Я попытался создать новую функцию, которая вызывает createShip () для любого объекта, а затем вызывать его с аргументом this. Но это не похоже на работу. Каков был бы правильный способ сделать это?

Planet.prototype.createShip =function() {...}

Planet.prototype.manageClick=function() {
    $(".dropdown").html("<button onclick=\"buyship(this)\">Buy a ship</button>");
}

function buyship(obj) {
    obj.createShip();
}
0
Jannes Braet 24 Май 2017 в 23:49

2 ответа

Лучший ответ

Не используйте onclick. Вместо этого используйте jquery для создания кнопки и привязки функции к событию click. Используя метод .bind функции, вы можете явно связать значение this с функцией, а не передавать его в качестве параметра.

Planet.prototype.createShip =function() {...}

Planet.prototype.ManageClick=function() {
    var self = this;
    var buyShip = $("<button id='buyShip'>Buy a ship</button>").click(buyship.bind(self))
    $(".dropdown").append(buyShip);
}

function buyship() {
    this.createShip();
} 

Скрипка: https://jsfiddle.net/brko5jr7/1/

2
richbai90 24 Май 2017 в 21:05

Я ненавижу использовать this, потому что если вы подключите какой-либо из методов вашего объекта к таким вещам, как обработчики событий jQuery, this может стать настоящей болью в тылу, если вы не будете правильно кодировать вещи.

Я не использую подход prototype для кодирования классов, как вы, но предпочитаю писать их как объявление функции.

var Planet = function(){
    var ref = this;
    ref.CreateShip = function () {
        ref.xyz = 123456;
    };

    ref.ManageClick = function(){
        ref.someproperty = "something";
    }
}

Вы сразу заметите, что я объявляю переменную ref, которая указывает на объект в области видимости, и затем я использую ref внутри членов вместо this. Это делает для лучшей читаемости, по моему мнению. YMMV .

Инстанция все та же:

Var instance = new Planet ();

0
Xavier J 24 Май 2017 в 21:00