объяснить, чем отличается prototype-based language от class-based? P.S. Возможно, ответят только челики, у которых есть опыт с языками типо Жабы.
Просто я для себя пытался разобраться. Как то мутновато все, в каше. У меня предположения, что это из-за того, что я серьезно работал только с жабаскриптом.
та что-то связано с тем как они прям на низком уровне создает и наследует классы, в любом случае я б вообще не парился
вот, и я про низкий уровень. Ну для понимания хотелось бы разобраться))
В классическом наследовании ты не можешь менять поведение на лету, нет никаких цепочек прототипов, отнаследовался - всё, это новый изолированный класс. Грубо говоря, одно клонирует, другое цепляет ссылку на родителя
Ооо. Уже интереснее
Класс — это тип, прототип — это объект. Класс не может быть изменён, прототип — может
То есть в class-based языке ты не сможешь условно из отнаследованного класса изменить поведения Base класса? Зачем тогда в таких языках принцип тех же Барбара лисок?
ну да там же на mdn написано что связь с родителем всегда отается через _proto_
Сможешь изменить поведение базового класса в контексте текущего класса. Сам базовый класс от этого не поменяется
Так. А условно в js'е мы это можем сделать, дойдя по цепочке прототипов до нужной штуки - верно?
Ну так принцип же не нарушается, контракт наследуемого класса сохраняется в наследнике
Принцип L касается подобных случаев class Parent { void method() { // implementation A } } class Child extends Parent { @Override void method() { //implementation B } }
Нет, ты не так понял :) Изменить ты можешь, но только в наследнике class B extends A { @Override() bar() { // new implementation } }
Создав экземпляр Child, ты будешь иметь доступ к имплементации Б. Создав Parent — к имплементации А Принцип подстановки заставляет тебя переопределять методы в детях так, чтобы имплементация Б не меняла основного поведения класса Parent
В ЖС мы можем такую еболу творить class A { foo() { return 1 } } class B extends A { foo() { return super.foo() * 2 } } A.prototype.foo = () => 10; console.log(new B().foo())
Обсуждают сегодня