02.01.2016, 22:04
|
Аспирант
|
|
Регистрация: 29.12.2015
Сообщений: 58
|
|
Сообщение от Keramet
|
уже в ES5 есть или их только планируют вводить?
|
В ES6. Уже поддерживаются новыми браузерами
|
|
03.01.2016, 19:37
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от Keramet
|
callbackhell,
Я вот тоже так думал, но:
1.
function Person() {}
var p1 = new Person();
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
var p2 = new Person();
2.
function Person() {}
var p1 = new Person();
Person.prototype = {
name : "Nicholas",
age : 29
};
var p2 = new Person();
дают разные результаты. В чём подвох - не пойму
|
в первом случае p1.__proto__ и p2.__proto__ ссылаются на один и тот же объект - Person.prototype. Он не менялся, в него просто добавили два поля.
Во втором - p1.__proto__ ссылается на предыдущий Person.prototype, который был заменен новым объектом уже после создания p1. И потому p1 более не считается экземпляром Person, с точки зрения прототипного ООП.
Второй случай вполне допустим, только заменять Person.prototype надо сразу же при создании функции Person, до создания экземпляров. И не забыть туда свойство constructor поместить, о чем ранее говорилось. Тогда всё будет нормалёк.
Ну а ежели какое наследование замутить изволите, то там особо без вариантов:
Person.prototype = Object.create(ParentClass.prototype);
и далее добавление методов по первой схеме.
|
|
03.01.2016, 19:44
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от callbackhell
|
Сейчас уже есть, к сожалению. Но классы -- это лишняя сущность. К тому же они реализованы отвратительно, их лучше не использовать, если Вам нужна гибкость.
|
Да не так уж и плохо реализованы. По сути это лишь синтаксический сахар для создания типовой конструкции - некоторого класса, возможно с указанием родителя. На выходе получаем ту же самую цепочку прототипов, ничего нового. Никакой дополнительной скрытой и непонятной реализации нет.
Вот что там действительно новое - "методы, привязанные к объектам". Штука в целом полезная и нужная.
https://learn.javascript.ru/es-object#методы-объекта
|
|
03.01.2016, 19:54
|
Интересующийся
|
|
Регистрация: 03.01.2016
Сообщений: 18
|
|
Сообщение от Яростный Меч
|
Да не так уж и плохо реализованы.
|
Угу, проперти в классе использовать нельзя, классы -- не ферст-класс объекты, следовательно нет метаобъектного программирования, для ссылок на суперкласс надо пользовать какие то нелепые костыли (без них this не биндится), можно продолжать, но уже достаточно чтобы забыть навсегда. Для такого динамического яп как js такой запил -- это форменное издевательство.
|
|
03.01.2016, 20:14
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от googlecallback
|
проперти в классе использовать нельзя,
|
можно
https://learn.javascript.ru/es-class...войства
Сообщение от googlecallback
|
классы -- не ферст-класс объекты, следовательно нет метаобъектного программирования,
|
function createClass() {
'use strict';
class User {
constructor(name) {
this.name = name;
}
sayHi() {
alert(this.name);
}
}
return User;
}
function createObject(Class, param) {
return new Class(param);
}
var User = createClass();
var user = createObject(User, "UserName123");
user.sayHi();
есть так же Class Expression, в общем, всё как положено.
Сообщение от googlecallback
|
для ссылок на суперкласс надо пользовать какие то нелепые костыли
|
вот как раз вызывать методы родительского класса стало проще простого, а раньше было геморно
|
|
03.01.2016, 20:14
|
Интересующийся
|
|
Регистрация: 03.01.2016
Сообщений: 18
|
|
Сообщение от Яростный Меч
|
"методы, привязанные к объектам". Штука в целом полезная и нужная.
|
Она "нужная" для JS только потому, что в нем используются говнопрактики проектирования, когда объекты заметаются под ковер. Эдакий недофапе - стайл на одних коллбеках
В нормальных ЯП с этим проблем нет. Там Вы писали бы что то такое
theTimeout = Timeout.create
theTimeout.a = 1
object = {
a: 10,
fu1: staticFunction(){alert(a)},
fu2: dynamicFunction(){alert(a)}
}
theTimeout.addOnTimeout(object.fu1)
theTimeout.addOnTimeout(object.fu2)
//>>>1, 10
|
|
03.01.2016, 20:18
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Сообщение от googlecallback
|
Она "нужная" для JS только потому, что в нем используются говнопрактики проектирования, когда объекты заметаются под ковер. Эдакий недофапе - стайл на одних коллбеках
В нормальных ЯП с этим проблем нет. Там Вы писали бы что то такое
theTimeout = Timeout.create
theTimeout.a = 1
object = {
a: 10,
fu1: staticFunction(){alert(a)},
fu2: dynamicFunction(){alert(a)}
}
theTimeout.addOnTimeout(object.fu1)
theTimeout.addOnTimeout(object.fu2)
//>>>1, 10
|
Ну вот и в JS появилось то же самое.
|
|
03.01.2016, 20:28
|
Интересующийся
|
|
Регистрация: 03.01.2016
Сообщений: 18
|
|
Сообщение от Яростный Меч
|
вот как раз вызывать методы родительского класса стало проще простого, а раньше было геморно
|
В чем гемор?
|
|
03.01.2016, 20:42
|
Интересующийся
|
|
Регистрация: 03.01.2016
Сообщений: 18
|
|
Яростный Меч,
Да, я наверное, плохо ознакомился, частично я не прав, тем не менее.
Классы нельзя считать первоклассными сущностями уже потому, что их протокол отличается от объектного. В них нельзя иметь проперти. Насколько я подозревю, ими нельзя манипулировать с помощью Object.defineProperty, так? Они, вероятно, не поддерживают проксирование. Сабклассинг неуклюж, всегда надо забивать голову оверррайдами. Требуют строгого режима. Если там копнуть глубже, всплывет еще куча дерьма.
Все равно при "классовом" подходе теряется гибкость. Я могу на коленке реализовать такие классы за пять минут, но могу и другие, с другой семантикой, ничего это не дает, по сути, просто еще один костыль.
|
|
03.01.2016, 20:48
|
Интересующийся
|
|
Регистрация: 03.01.2016
Сообщений: 18
|
|
Яростный Меч,
Единственное ощутимое преимущество -- эт унификация кода в ынтырпрайзе. Но меня это не касается лично
|
|
|
|