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 и т.д. Или у тебя за ширмой реализации скрыта какая то магия?)

devote 04.09.2013 13:23

Цитата:

Сообщение от kobezzza
Или у тебя за ширмой реализации скрыта какая то магия?)

именно)) не переживай, все передается как надо) без вызовов call, apply хотя и их не запрещено использовать) и не дождешься никакой рекурсии

kobezzza 04.09.2013 13:26

Цитата:

Сообщение от devote (Сообщение 270785)
именно)) не переживай, все передается как надо) без вызовов call, apply хотя и их не запрещено использовать) и не дождешься никакой рекурсии

удобно:)

devote 04.09.2013 13:31

Цитата:

Сообщение от kobezzza (Сообщение 270786)
удобно:)

Ну да, яж не один день потратил на реализацию этого функционала. Тестил все, много тестил)))

monolithed 04.09.2013 15:52

Цитата:

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

CoffeeScriptтился )

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

danik.js 04.09.2013 16:26

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

alert((new __class()).static)

devote 04.09.2013 16:29

Цитата:

Сообщение от monolithed (Сообщение 270814)
var __class = function() {};
__class.static = 1;

тут скорее так надо:
var __class = function() {};
__class.static = __class.prototype.static = 1;


alert((new __class()).static)
alert(__class.static);

danik.js 04.09.2013 16:48

Вот она, красота синтаксиса :)

monolithed 04.09.2013 18:42

Цитата:

Сообщение от devote
тут скорее так надо:

Ну да, если в С++ работает значит и у нас должно )

#include <iostream>
#include <memory>

class __class {
	public:
		static const int property = 1;
};

int main() {
	std::unique_ptr<__class> instance(new __class);

	std::cout << instance->property + __class::property << std::endl;

	return 0;
}


Ну ничё, ES6 уже почти готов

iLikeMaxmaxmaximus 04.09.2013 21:06

function Cat (){}

Cat.static = 

Cat.prototype.public =

Cat.prototype._private =

kobezzza 04.09.2013 21:31

А я всё ждал, когда же появится максимус в этой теме :)

iLikeMaxmaxmaximus 04.09.2013 22:28





How have you been?


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