Ошибка «Неперехваченная ошибка типа» при изменении свойства этого объекта- JavaScript

#javascript #javascript-objects

#javascript #javascript-объекты

Вопрос:

Я изучаю объекты и прототипы в JavaScript, и я застрял. Моя цель — создать объект, который затем будет отображен на странице. Я создал другой конструктор прототипа, чтобы позже этот конкретный созданный объект можно было переместить на страницу, однако это не работает, и я не знаю, как с этим работать дальше

вот мой JS:

 var Bunny = function (x, y) {
    this.x = x;
    this.y = y;
}

Bunny.prototype.drawBunny = function () {
    var bunnyImage =  document.createElement('img');
    bunnyImage.src = "https://64.media.tumblr.com/tumblr_m06yweMXBl1qaajuxo1_500.gif";
    bunnyImage.style.position = "absolute";
    bunnyImage.style.left = this.x   "px";
    bunnyImage.style.top = this.y   "px";
    document.getElementsByTagName("body")[0].appendChild(bunnyImage);
}

Bunny.prototype.moveRight = function() {
    this.x  = 5;
    this.bunnyImage.style.left = this.x   "px";
    this.bunnyImage.style.top = this.y   "px";
}
  

а затем в журнале консоли (это работает):

 var sunflower = new Bunny(200, 200);
sunflower.drawBunny();
  

но когда я пишу это в журнале консоли:

 sunflower.moveRight();
  

Я получаю эту ошибку:

Неперехваченная ошибка типа: this.bunnyImage не определен

указание на this.bunnyImage в moveRight() функции

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

1. Ваш this.bunnyImage не определен

2. Ваш код никогда не создает bunnyImage свойство для объекта. var Переменная в drawBunny этого не делает; вам нужно где-то this.bunnyImage установить.

Ответ №1:

Определите «Это не работает» (одного этого утверждения недостаточно, чтобы помочь). В вашем случае консоль выдает :

Неперехваченная ошибка типа: не удается прочитать свойство ‘style’ неопределенного

Действительно, this.bunnyImage не определено. Вы забыли сохранить его в своей функции с this.bunnyImage = bunnyImage;

 var Bunny = function(x, y) {
  this.x = x;
  this.y = y;
}

Bunny.prototype.drawBunny = function() {
  var bunnyImage = document.createElement('img');
  bunnyImage.src = "https://64.media.tumblr.com/tumblr_m06yweMXBl1qaajuxo1_500.gif";
  bunnyImage.style.position = "absolute";
  bunnyImage.style.left = this.x   "px";
  bunnyImage.style.top = this.y   "px";
  this.bunnyImage = bunnyImage;
  document.getElementsByTagName("body")[0].appendChild(bunnyImage);
}

Bunny.prototype.moveRight = function() {
  this.x  = 5;
  this.bunnyImage.style.left = this.x   "px";
  this.bunnyImage.style.top = this.y   "px";
}

var sunflower = new Bunny(200, 200);

sunflower.drawBunny();
sunflower.moveRight();  

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

1. Большое спасибо! Я создавал эту задачу по книге и не был уверен, что такое bunnyImage. Также спасибо за совет, я забыл добавить сообщение об ошибке.

Ответ №2:

 var Bunny = function (x, y) {
    this.x = x;
    this.y = y;
}

Bunny.prototype.drawBunny = function () {
    this.bunnyImage =  document.createElement('img');
    this.bunnyImage.src = "https://64.media.tumblr.com/tumblr_m06yweMXBl1qaajuxo1_500.gif";
    this.bunnyImage.style.position = "absolute";
    this.bunnyImage.style.left = this.x   "px";
    this.bunnyImage.style.top = this.y   "px";
    document.getElementsByTagName("body")[0].appendChild(this.bunnyImage);
}

Bunny.prototype.moveRight = function(delta = 5) {
    this.x  = delta;
    this.bunnyImage.style.left = this.x   "px";
    this.bunnyImage.style.top = this.y   "px";
}

var sunflower = new Bunny(200, 0);
sunflower.drawBunny();

// Lets dance
setInterval(() => {
  sunflower.moveRight(200 * (.5 - Math.random()))
}, 200)  

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

1. Ответы гораздо полезнее с объяснением того, что нужно было изменить или улучшить, и почему вы решили сделать все так, как вы сделали.