Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Классы js... (https://javascript.ru/forum/offtopic/41193-klassy-js.html)

l-liava-l 03.09.2013 19:37

Классы js...
 
Доброго времени суток!

Почему плохо говорят про зайцев, прототипное наследование? Типо в js нет классов... Да но только на уровне языка, а так они легко эмулируются, следовательно классы есть, результат то на выходе один.

Тем более в экма 6. Я понимаю что это все та же цепочка прототипов, эмулирующая классы, но синтаксис нормальный, что еще нужно???

Мне кажется или тут вопрос скорее философский?:)

kobezzza 03.09.2013 20:11

Просто для многих главным признаком наличия классов в языке является наличие ключевого слова class :) А вообще полезно задать себе вопрос: "а что есть класс?", и выянится, что в JavaScript есть классы, просто их реализация немного отличается от реализации скажем в Java. Как раз для таких людей и добавили в следующем стандарте новую "сахарную" обёртку. Лично я использую слово "класс" в отношении JS и ещё ни разу не встречал человека, который бы не понял, что я имею ввиду, но зато встречал много тех, кто на макросе начинал кричать: "в JS нет классов, нуб!".

nerv_ 04.09.2013 00:12

Если Винни Пух сказал, что это мед, значит это мед :)

danik.js 04.09.2013 01:39

Цитата:

Сообщение от l-liava-l
но синтаксис нормальный, что еще нужно???

Покажи как на нормальном синтаксисе выглядят статические методы "классов" в JS, обращение к методам родительского лкасса, а также множественное наследование. Ну и раз есть классы, то может завалялись и интерфейсы? Штука весьма полезная в сложных приложениях.

kobezzza 04.09.2013 10:23

Цитата:

Сообщение от danik.js (Сообщение 270746)
Покажи как на нормальном синтаксисе выглядят статические методы "классов" в JS, обращение к методам родительского лкасса, а также множественное наследование. Ну и раз есть классы, то может завалялись и интерфейсы? Штука весьма полезная в сложных приложениях.

Для декларации статических методов добавили модификатор static. Обращение к родительской реализации метода через ключевое слово "super". Множественное наследование возможно будет с использованием объекта Proxy: вешаем обработчик на событие "не найдено свойство или метод" и в обработчики переправляем поиск на дополнительную цепь прототипов. На данный момент в ИЕ11 объекта Proxy нет, увы.

monolithed 04.09.2013 11:53

Цитата:

Сообщение от danik.js
Покажи как на нормальном синтаксисе выглядят статические методы "классов" в JS

var __class = function() {
   this.static = 1;
}

new __class().static;

devote 04.09.2013 12:06

monolithed,
дык это не статический метод, ты уже создаешь экземпляр класса и получаешь свойство у созданного экземпляра, что уже является не статическим свойством.

devote 04.09.2013 12:09

Цитата:

Сообщение от danik.js
обращение к методам родительского лкасса

function Foo() {
    this.bar = 1;
}
function Bar() {
    this.bar = 2;
    // обращение к методам/свойствам родительского класса
    alert(Object.getPrototypeOf(this).bar);
}
Bar.prototype = new Foo();
new Bar();

devote 04.09.2013 12:25

Нормальный синтаксис че ;)
<script type="text/javascript" src="https://github.com/devote/jsClasses/raw/master/class.js"></script>
<script type="text/javascript">
// выглядят статические методы "классов" в JS
var Foo = Class({
    static: 1
}, {
    fooMethod: function() {
        alert('foo');
    }
});

alert(Foo.static);





// обращение к методам родительского класса
var Bar = Class({
    method: function() {
        alert('Я родитель че');
    }
});
var Baz = Class(Bar, {
    method: function() {
        this.parent.method();
        alert('Я НЕ родитель че');
    }
});
new Baz().method();





// а также множественное наследование
var Zaz = Class([Foo, Baz], {
    zazMethod: function() {
        alert('zaz');
    }
});

var inst = new Zaz();
inst.fooMethod();
inst.method();
inst.zazMethod();
</script>

kobezzza 04.09.2013 12:54

devote, а как у тебя передаётся контекст вызова родительскому методу при перекрытии в дочернем? Ведь если написать:

this.parent.method.call(this);


То выполнение метода уйдёт в рекурсии при наследовании выше второго уровня: superParent > parent > child и т.д. Или у тебя за ширмой реализации скрыта какая то магия?)


Часовой пояс GMT +3, время: 08:50.