Наследование прототипов — это мощная парадигма JavaScript, но управление большими приложениями может оказаться сложной задачей. Рассмотрим класс карусели с многочисленными функциями:
Carousel.prototype.next = function () {...} Carousel.prototype.prev = function () {..} Carousel.prototype.bindControls = function () {..}
Рефакторинг для лучшей организации кода может включать группировку функций в подобъекты:
Carousel.prototype.controls = { next: function () { ... } , prev: function() { ... }, bindControls: function () { .. } }
Однако это изменение создает проблему: ключевое слово «this» в этих функциях больше не относится к экземпляру карусели.
Поддержка контекст «this» имеет решающее значение, особенно в сценариях, где классы наследуются от родительских классов. Переопределение функций в унаследованных классах должно сохранять правильное «это» поведение.
Один из подходов — определить Controls как отдельный класс и сохранить ссылку к экземпляру карусели:
var Controls = function (controllable_object) { this.ref = controllable_object; }; Controls.prototype.next = function () { this.ref.foo(); } // ..
Хотя это решение решает «эту» проблему, оно предотвращает переопределение реализации элементов управления.
Более гибкий подход предполагает внедрение зависимостей :
var Controls = function (controllable_object) { this.ref = controllable_object; }; Controls.prototype.next = function () { this.ref.foo(); } // .. var Carousel = function () { this.controllers = []; }; Carousel.prototype.addController = function (controller) { this.controllers.push(controller); }; // ..
В этом сценарии класс карусели может добавлять несколько контроллеров, поддерживающих несколько наборов функций и позволяющих легко переопределять.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3