Enroller
@Enroller
Немного авантюрист

Как обратиться к хеш объекту конструктора из прототипа?

Здравствуйте !

Разбираюсь с прототипами сижу.. пишу себе радостно код и вдруг IDE выдаёт что вариэйбл не экспортед..
Смотрю консоль .. и правда :

Uncaught TypeError: Cannot read property 'pointNavigation' of undefined
    at Slider.init (mainScript.js:28)
    at new Slider (mainScript.js:21)
    at window.onload (mainScript.js:3)


По любому ключу undefined..

Собсно пишу я просто слайдер и ошибки в логике искать не надо.
А вот как же правильно обращаться к хешу - вопрос жизни и смерти !

Инициализация экземпляра :

window.onload = function(){
    let featuresSlider = new Slider({
        element: ".slider",
        wrapper: ".sliderItems",
        slides: ".sliderItem",
        activeSlideClass: ".sliderItem__active",
        points: ".slider__nav input",
        prev: ".footerSliderItem__prev",
        next: ".footerSliderItem__next",
        pointNavigation: true,
    });
    featuresSlider.init();
};


Конструктор :

function Slider(settings){
    this.el = document.querySelector(settings.element);
    this.init();
}


Прототип:
Slider.prototype = {
    init: function () {
        let slidesCounter = 0;
        if(! (settings.pointNavigation)){
            this.points = document.querySelectorAll(settings.points);
            this.navigatePoints();
        }
        this.slides = document.querySelectorAll(settings.slides);
        this.prev = document.querySelector(settings.prev);
        this.next = document.querySelector(settings.next);
        this.prev.onclick = prev;
        this.next.onclick = next;

    },
    navigatePoints : function () {
        let self = this;

        for(let i = 0, length = this.points.length; i < length; i++){
            let point = this.points[i];
            point.addEventListener("click", function (e) {
                self.slide(this);
            });
        }
        
    },
    prev: function() {

        self.slides[slidesCounter].classList.remove(settings.activeSlideClass);
        slidesCounter--;
        if(slidesCounter < self.slides.length){
            slidesCounter = self.slides.length - 1;
        }
        self.slides[slidesCounter].classList.add(settings.activeSlideClass);
    },
    next: function() {

        self.slides[slidesCounter].classList.remove(settings.activeSlideClass);
        slidesCounter++;
        if(slidesCounter <= self.slides.length){
            slidesCounter = 0;
        }
        self.slides[slidesCounter].classList.add(settings.activeSlideClass);
    },
    slide: function (element) {

        this.setCurrentInput(element);

        if(! (settings.pointNavigation)){

            this.setCurrentLink(element);

            let index = parseInt(element.getAttribute("data-slide"), 10) +1;
            let currentSlide = this.el.querySelector(settings.wrapper + `:nth-child(${index})`);
            let activeSlide = this.el.querySelector(settings.activeSlideClass);

            if(! (currentSlide.classList.contains(settings.activeSlideClass))){
                return;
            }

            activeSlide.classList.remove(settings.activeSlideClass);
            currentSlide.classList.add(settings.activeSlideClass);
        }
        },
    setCurrentInput: function (input) {
        let parent = input.parentNode;
        let inputs = parent.querySelectorAll("input");

        input.className = "slider__navPoint slider__navPoint_active";
        this.currentElement = input;

        for(let i = 0, length = inputs.length; i < length; ++i){
            let cur = inputs[i];
            if (cur !== input){
                cur.className = "slider__navPoint";
            }
        }
    }
};


Заранее спасибо за участие )
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Slider.prototype = {
    init: function () {
        let slidesCounter = 0;
        if(! (settings.pointNavigation)){

откуда у Вас тут settings взялся?
нужно положить в this и потом брать от туда:
function Slider(settings){
    this.el = document.querySelector(settings.element);
    this.settings = settings;
    this.init();
}

Slider.prototype = {
    init: function () {
        let slidesCounter = 0;
        if(! (this.settings.pointNavigation)){
// ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы