Я провел последние пару часов, пытаясь найти решение своей проблемы, но это кажется безнадежным.
В основном мне нужно знать, как вызвать родительский метод из дочернего класса. Все, что я пробовал до сих пор, заканчивается тем, что либо не работает, либо переписывает родительский метод.
Я использую следующий код для настройки ООП в JavaScript:
// SET UP OOP
// surrogate constructor (empty function)
function surrogateCtor() {}
function extend(base, sub) {
// copy the prototype from the base to setup inheritance
surrogateCtor.prototype = base.prototype;
sub.prototype = new surrogateCtor();
sub.prototype.constructor = sub;
}
// parent class
function ParentObject(name) {
this.name = name;
}
// parent's methods
ParentObject.prototype = {
myMethod: function(arg) {
this.name = arg;
}
}
// child
function ChildObject(name) {
// call the parent's constructor
ParentObject.call(this, name);
this.myMethod = function(arg) {
// HOW DO I CALL THE PARENT METHOD HERE?
// do stuff
}
}
// setup the prototype chain
extend(ParentObject, ChildObject);
Мне нужно сначала вызвать метод родителя, а затем добавить еще кое-что в дочерний класс.
В большинстве языков ООП это было бы так просто, как вызов. parent.myMethod()
Но я действительно не могу понять, как это делается в javascript.
Любая помощь очень ценится, спасибо!
источник
ParentClass.prototype.myMethod.apply() or
ParentClass.prototype.myMethod.call () `, как вы делаете это с вашим конструктором.ParentClass.prototype.myMethod.call(this, arg1, arg2, arg3...);
)myMethod
в вашем классе.Стиль ES6 позволяет использовать новые функции, такие как
super
ключевое слово.super
Ключевое слово это все о контексте родительского класса, когда вы используете синтаксис классов ES6. В качестве очень простого примера, оформить заказ:Также вы можете использовать
super
для вызова родительского конструктора:И, конечно, вы можете использовать его для доступа к свойствам родительского класса
super.prop
. Итак, используйте ES6 и будьте счастливы.источник
super
называть? Есть ли эквивалентность в «старых» JS?super()
в статических методах; Похоже, вы использовали его в конструкторе.Ну, чтобы сделать это, вы не ограничены
Class
абстракцией ES6. Доступ к методам прототипа родительского конструктора возможен с помощью__proto__
свойства (я уверен, что будут и другие JS-кодеры, которые будут жаловаться на то, что оно устарело), которое устарело, но в то же время обнаружило, что оно действительно является важным инструментом для нужд подкласса ( особенно для нужд подклассов массива, хотя). Таким образом, в то время как__proto__
свойство все еще доступно во всех основных движках JS, которые я знаю, ES6 представилObject.getPrototypeOf()
функциональность поверх него.super()
Инструмент вClass
абстракции является синтаксическим сахаром этого.Поэтому, если у вас нет доступа к имени родительского конструктора и вы не хотите использовать
Class
абстракцию, вы все равно можете сделать следующее;источник
В случае множественного уровня наследования эта функция может использоваться как метод super () в других языках. Вот демо скрипка , с некоторыми тестами, вы можете использовать ее следующим образом:
call_base(this, 'method_name', arguments);
В нем используются новейшие функции ES, совместимость со старыми браузерами не гарантируется. Протестировано в IE11, FF29, CH35.
источник
Как насчет чего-то, основанного на идее Дугласа Крокфорда:
источник
Вот хороший способ для дочерних объектов иметь доступ к родительским свойствам и методам, используя цепочку прототипов JavaScript, и он совместим с Internet Explorer. JavaScript ищет в цепочке прототипов методы, и мы хотим, чтобы цепочка прототипов дочернего элемента выглядела так:
Дочерний экземпляр -> Дочерний прототип (с дочерними методами) -> Родительский прототип (с родительскими методами) -> Объектный прототип -> нуль
Дочерние методы также могут вызывать теневые родительские методы, как показано на трех звездочках *** ниже.
Вот как:
источник
Для многоуровневого поиска прототипов существует гораздо более простое и компактное решение, но оно требует
Proxy
поддержки. Использование:SUPER(<instance>).<method>(<args>)
например, если предположить два классаA
иB extends A
с помощью методаm
:SUPER(new B).m()
.источник
В то время как вы можете вызвать родительский метод , с помощью прототипа родителя, вам нужно будет пройти текущий экземпляр ребенка для использования
call
,apply
илиbind
метода.bind
Метод будет создавать новую функцию , поэтому я не рекомендую, если вы заботитесь о производительности , кроме него вызывается только один раз.В качестве альтернативы вы можете заменить дочерний метод и поместить родительский метод в экземпляр при вызове исходного дочернего метода.
источник