Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как можно унаследовать от класса функцию? (https://javascript.ru/forum/misc/77919-kak-mozhno-unasledovat-ot-klassa-funkciyu.html)

js123 02.07.2019 18:01

Как можно унаследовать от класса функцию?
 
Есть код с классами An и Ba. Необходимо сделать , чтобы класс Ba унаследовал от An функцию :
function moveElement(arr,from,to)
{arr.splice(to,0,arr.splice(from,1)[0]);  return arr;};
if (arr[0]>arr[1])
document.write(moveElement(arr,0,1)); 
alert ('hello');

Так как функция An уже переместила элементы массива ,учитывая перемещение, функция Ba должна переместить тоже и вывести массив: 3,2,4,1.
Первое перемещение происходит, но второе нет. Как унаследовать от An функцию?
Вот полный код.
var arr = [4, 3, 2, 1]; 
 function An()  
{function moveElement(arr,from,to)
{arr.splice(to,0,arr.splice(from,1)[0]);  return arr;};
if (arr[0]>arr[1])
document.write(moveElement(arr,0,1)); 
alert ('hello');}
 var an = new An();
function Ba() 
 { An.apply(this, arguments); }                           
Ba.prototype = Object.create(An.prototype);  
Ba.prototype.constructor = Ba;               
var ba = new Ba ();

j0hnik 03.07.2019 08:59

Цитата:

Сообщение от js123
функция Ba должна переместить тоже и вывести массив: 3,2,4,1.

у вас после первого перемещения не выполняется условие arr[0]>arr[1], поэтому никакого дальнейшего перемещения не будет.
да и побочки в конструкторе такое себе.. не привыкайте.

js123 03.07.2019 18:09

Ошибка понятна. Спасибо за подсказку. Что значит ' побочки в конструкторе '. Как это исправить ?

Malleys 04.07.2019 04:14

Цитата:

Сообщение от js123
Что значит ' побочки в конструкторе '. Как это исправить ?

Я думаю, что вам намекают, что такие побочные эффекты в конструкторе являются плохой практикой!

Например, в констркуторе вы используете вызовы функции, которые меняют что-то вне конструктора. (А именно в этом примере массив arr)

Я не представляю, что же могут означать эти классы (An и Ba), но то, как вы используете метод moveElement, показывает, что вам такие классы не нужны, чтобы они не представляли. У меня сложилось впечатление, что вы хотите добавить методы для работы с массивом! В таком случае, почему бы не наследовать от класса Array. (Ведь именно с его экземпляром вы и пытаетесь работать)

{
	class MyArrayExtension extends Array {
		moveElement(from, to) {
			this.splice(to, 0, this.splice(from, 1)[0]);
			return this;
		}
	}

	const an = new MyArrayExtension(4, 3, 2, 1);
	an.moveElement(0, 1);

	console.log(an);
}

j0hnik 04.07.2019 04:34

Цитата:

Сообщение от Malleys
Я думаю, что вам намекают, что такие побочные эффекты в конструкторе являются плохой практикой!

Верно!
Цитата:

Сообщение от Malleys
вам такие классы не нужны

для таких целей я бы обычную функцию/метод использовал.


Часовой пояс GMT +3, время: 12:52.