В PHP / Java можно:
class Sub extends Base
{
}
И автоматически все общедоступные / защищенные методы, свойства, поля и т. Д. Суперкласса становятся частью подкласса, который при необходимости можно переопределить.
Что эквивалентно этому в Javascript?
javascript
oop
Нажмите Голосовать за
источник
источник
Ответы:
Я изменил то, как я это делаю сейчас, я стараюсь избегать использования функций-конструкторов и их
prototype
свойств, но мой старый ответ от 2010 года все еще находится внизу. Я сейчас предпочитаюObject.create()
.Object.create
доступен во всех современных браузерах.Я должен отметить, что
Object.create
обычно это намного медленнее, чем использованиеnew
с конструктором функции.jsfiddle
Одним из больших преимуществ использования Object.create является возможность передавать аргумент defineProperties , который дает вам значительный контроль над тем, как можно получить доступ к свойствам класса и перечислить их, а также я использую функции для создания экземпляров, они служат в качестве конструкторы, так как вы можете выполнить инициализацию в конце вместо того, чтобы просто возвращать экземпляр.
jsfiddle
Это мой оригинальный ответ 2010 года:
источник
alert()
чтобы посмотреть, чтоinstance.showColor()
возвращается, я все равно получаюundefined
. jsbin.com/uqalin/1В JavaScript у вас нет классов, но вы можете получить наследование и повторное использование поведения разными способами:
Псевдоклассическое наследование (через прототипирование):
Следует использовать с
new
оператором:Применение функции или «цепочка конструкторов»:
Этот подход также следует использовать с
new
оператором:Разница с первым примером является то , что , когда мы конструктор для объекта внутри , он добавляет свойства , назначенные на непосредственно на новом экземпляре, например , содержит свойство и непосредственно ( ).
apply
Super
this
Sub
this
Super
subInstance
member1
member2
subInstance.hasOwnProperty('member1') == true;
В первом примере эти свойства достигаются через цепочку прототипов , они существуют во внутреннем
[[Prototype]]
объекте.Паразитное наследование или конструкторы мощности:
Этот подход основан в основном на «увеличении объекта», вам не нужно использовать
new
оператор, и, как видите,this
ключевое слово не задействовано.ECMAScript 5-е изд.
Object.create
метод:Вышеупомянутый метод является прототипной техникой наследования, предложенной Крокфордом .
Экземпляры объектов наследуются от других экземпляров объекта, вот и все.
Этот метод может быть лучше , чем просто «объект увеличения» , потому что наследственные свойства не копируются все новые экземпляры объектов, так как базовая объект установлен как
[[Prototype]]
часть расширенного объекта, в приведенном выше примере ,subInstance
содержит физически толькоmember3
свойство.источник
Object.create()
или пользовательскуюclone()
функцию (например, mercurial.intuxication.org/hg/js-hacks/raw-file/tip/clone.js ) для прямого наследования от объекта-прототипа; см. комментарии к stackoverflow.com/questions/1404559/… для объясненияObject.create
метод :)member1
переменную, что совершенно нежелательно. Конечно, они могут его переписать, но в этом нет смысла. github.com/dotnetwise/Javascript-FastClass - лучшее решение для сахара.Sub.prototype = new Super();
. Что, если оба класса никогда не будут использоваться во время выполнения скрипта? Похоже, проблема с производительностью. Зачем мне создавать родительский класс, если дочерний класс фактически не используется? Не могли бы вы уточнить, пожалуйста? Вот простая демонстрация проблемы: jsfiddle.net/slavafomin/ZeVL2 Спасибо!Для тех, кто перейдет на эту страницу в 2019 году или позже
В последней версии стандарта ECMAScript (ES6) вы можете использовать ключевое слово
class
.Обратите внимание, что определение класса не является обычным
object
; следовательно, между членами класса нет запятых. Чтобы создать экземпляр класса, вы должны использоватьnew
ключевое слово. Чтобы унаследовать от базового класса, используйтеextends
:Чтобы унаследовать от базового класса, используйте
extends
:Из производного класса вы можете использовать super из любого конструктора или метода для доступа к его базовому классу:
super().
super.getName()
,.Есть еще кое-что об использовании классов. Если вы хотите углубиться в тему, я рекомендую « Классы в ECMAScript 6 » доктора Акселя Раушмайера. *
источник
источник
class
иextends
есть (очень полезный) синтаксический сахар для цепочки прототипов: stackoverflow.com/a/23877420/895245Ну, в JavaScript нет «наследования классов», есть только «наследование прототипа». Таким образом, вы не создаете класс «грузовик», а затем помечаете его как подкласс «автомобиль». Вместо этого вы создаете объект «Джек» и говорите, что он использует «Джон» в качестве прототипа. Если Джон знает, сколько "4 + 4", то и Джек это знает.
Я предлагаю вам прочитать статью Дугласа Крокфорда о прототипном наследовании здесь: http://javascript.crockford.com/prototypal.html Он также показывает, как вы можете сделать JavaScript "похожим" на наследование, как в других объектно-ориентированных языках, а затем объясняет, что это на самом деле означает нарушение javaScript не предназначенным для использования способом.
источник
Я считаю эту цитату наиболее поучительной:
Мне нравится использовать конструкторы, а не объекты, поэтому я неравнодушен к методу «псевдоклассического наследования», описанному здесь CMS . Вот пример множественного наследования с цепочкой прототипов :
Вот еще один хороший ресурс от MDN , и вот jsfiddle, чтобы вы могли его попробовать .
источник
Наследование Javascript немного отличается от Java и PHP, потому что на самом деле у него нет классов. Вместо этого у него есть объекты-прототипы, которые предоставляют методы и переменные-члены. Вы можете связать эти прототипы, чтобы обеспечить наследование объектов. Наиболее распространенный паттерн, который я обнаружил при исследовании этого вопроса, описан в сети разработчиков Mozilla . Я обновил их пример, чтобы включить вызов метода суперкласса и показать журнал в предупреждающем сообщении:
Лично я считаю наследование в Javascript неудобным, но это лучшая версия, которую я нашел.
источник
вы не можете (в классическом смысле). Javascript - это прототип языка. Вы заметите, что никогда не объявляете «класс» в Javascript; вы просто определяете состояние и методы объекта. Чтобы произвести наследование, вы берете какой-нибудь объект и создаете его прототип. Прототип расширен новыми функциями.
источник
Можно использовать
.inheritWith
и.fastClass
библиотеку . Это быстрее, чем большинство популярных библиотек, а иногда даже быстрее, чем нативная версия.Очень просто использовать:
использование
источник
источник
Прочитав много сообщений, я придумал это решение ( здесь jsfiddle ). В большинстве случаев мне не нужно что-то более сложное
источник
Благодаря ответу CMS и после некоторой возни с прототипом и Object.create, а также с другими вещами, я смог придумать изящное решение для моего наследования с использованием apply, как показано здесь:
источник
Из ES2015 именно так вы делаете наследование в JavaScript.
источник
источник
Классы ES6:
В Javascript нет классов. Классы в javascript - это просто синтаксический сахар, построенный поверх прототипного шаблона наследования , который javascript. Вы можете использовать JS
class
для принудительного прототипного наследования, но важно понимать, что на самом деле вы все еще используете функции конструктора под капотом.Эти концепции также применимы, когда вы расширяетесь из
es6
«класса» с помощью ключевого слова extends. Это просто создает дополнительное звено в цепочке прототипов. В__proto__
Пример:
Object.create ()
Object.create()
также способ создать наследование в JS в javascript.Object.create()
- это функция, которая создает новый объект, в качестве аргумента принимает существующий объект. Он назначит объект, который был получен в качестве аргумента,__proto__
свойству вновь созданного объекта. Опять же, важно понимать, что мы привязаны к прототипной парадигме наследования, которую воплощает JS.Пример:
источник
Вы не можете наследовать от класса в JavaScript, потому что в JavaScript нет классов.
источник