Не очищаются данные с прошлого вызова метода js
Всем привет!
Подскажите, пожалуйста, как вызвать метод sayHello() только для одного объекта?
Нужно, чтоб при клике на button в консоле отоборажалось имя только одного объекта.
Например, кликнув на <button class="Btn" onclick="something(this)">person</button>, а после на button с именем sayHello(), в консоле должно отображаться
Hello, my name is Liza!
На данном этапе основная ОШИБКА - после нажатия всех button выводяться name всех объектов, т е eсли кликнуть на <button class="Btn" onclick="something(this)">person</button>, после button с именем sayHello(), после на <button class="Btn" onclick="something(this)">animal</button> и опять на sayHello() - вместо вывода name объекта Animal выведет оба name:
2 newscript.js:8 Hello, my name is Liza!`
newscript.js:8 Hello, my name is Kuzia!
function Create (name) {
this.name = name;
}
Create.prototype.sayHello = function () {
return console.log(`Hello, my name is ${this.name}!`);
}
function Person (name, job) {
Create.call(this, name);
this.job = job;
}
Person.prototype = Object.create(Create.prototype);
Person.prototype.constructor = Create;
function Animal (name, color) {
Create.call(this, name);
this.color = color;
}
Animal.prototype = Object.create(Create.prototype);
Animal.prototype.constructor = Create;
function Doctor (name, job, title) {
Person.call(this,name, job);
this.title = title;
}
Doctor.prototype = Object.create(Person.prototype);
Doctor.prototype.constructor = Person;
let properties = document.getElementById('properties');
let btnHello = document.createElement('button');
btnHello.innerHTML = 'Say hello';
btnHello.setAttribute('id', 'hello');
properties.appendChild(btnHello);
let hello = document.getElementById('hello');
let n = document.getElementsByTagName('button');
function something(passed) {
if (passed.innerHTML === 'person'){
passed = new Person('Liza', 'beauty master');
} else if (passed.innerHTML === 'doctor'){
passed = new Doctor('Mark', 'doctor', 'surgery');
} else if (passed.innerHTML === 'animal'){
passed = new Animal('Kuzia', 'Brown');
}
hello.addEventListener('click', () => {
passed.sayHello()
})
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/new.css">
</head>
<body>
<div>
<div>
<div id="properties"></div>
</div>
<button class="Btn" onclick="something(this)">person</button>
<button class="Btn" onclick="something(this)">doctor</button>
<button class="Btn" onclick="something(this)">animal</button>
</div>
<script src="js/newscript.js"></script>
</body>
</html>
Ответы (1 шт):
Текущий код конечно конкретно запутанный... Но одно из решений: вынести выбранного персонажа в глобальное пространство. И там же слушателя повесить на кнопку. В функции лишь менять этого персонажа
ЗЫ: тут не учтён будет тот факт, что можно нажать на кнопку до того, как персонаж будет выбран и надо установить что-то дефолтное
let chooserPerson = null;
function something(passed) {
if (passed.innerHTML === 'person'){
chooserPerson = new Person('Liza', 'beauty master');
} else if (passed.innerHTML === 'doctor'){
chooserPerson = new Doctor('Mark', 'doctor', 'surgery');
} else if (passed.innerHTML === 'animal'){
chooserPerson = new Animal('Kuzia', 'Brown');
}
}
hello.addEventListener('click', () => {
chooserPerson.sayHello()
})