Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 02.01.2016, 22:04
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Сообщение от Keramet
уже в ES5 есть или их только планируют вводить?
В ES6. Уже поддерживаются новыми браузерами
Ответить с цитированием
  #22 (permalink)  
Старый 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);
и далее добавление методов по первой схеме.
Ответить с цитированием
  #23 (permalink)  
Старый 03.01.2016, 19:44
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от callbackhell Посмотреть сообщение
Сейчас уже есть, к сожалению. Но классы -- это лишняя сущность. К тому же они реализованы отвратительно, их лучше не использовать, если Вам нужна гибкость.
Да не так уж и плохо реализованы. По сути это лишь синтаксический сахар для создания типовой конструкции - некоторого класса, возможно с указанием родителя. На выходе получаем ту же самую цепочку прототипов, ничего нового. Никакой дополнительной скрытой и непонятной реализации нет.

Вот что там действительно новое - "методы, привязанные к объектам". Штука в целом полезная и нужная.
https://learn.javascript.ru/es-object#методы-объекта
Ответить с цитированием
  #24 (permalink)  
Старый 03.01.2016, 19:54
Интересующийся
Посмотреть профиль Найти все сообщения от googlecallback
 
Регистрация: 03.01.2016
Сообщений: 18

Сообщение от Яростный Меч
Да не так уж и плохо реализованы.
Угу, проперти в классе использовать нельзя, классы -- не ферст-класс объекты, следовательно нет метаобъектного программирования, для ссылок на суперкласс надо пользовать какие то нелепые костыли (без них this не биндится), можно продолжать, но уже достаточно чтобы забыть навсегда. Для такого динамического яп как js такой запил -- это форменное издевательство.
Ответить с цитированием
  #25 (permalink)  
Старый 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 Посмотреть сообщение
для ссылок на суперкласс надо пользовать какие то нелепые костыли
вот как раз вызывать методы родительского класса стало проще простого, а раньше было геморно
Ответить с цитированием
  #26 (permalink)  
Старый 03.01.2016, 20:14
Интересующийся
Посмотреть профиль Найти все сообщения от googlecallback
 
Регистрация: 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
Ответить с цитированием
  #27 (permalink)  
Старый 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 появилось то же самое.
Ответить с цитированием
  #28 (permalink)  
Старый 03.01.2016, 20:28
Интересующийся
Посмотреть профиль Найти все сообщения от googlecallback
 
Регистрация: 03.01.2016
Сообщений: 18

Сообщение от Яростный Меч
вот как раз вызывать методы родительского класса стало проще простого, а раньше было геморно
В чем гемор?
Ответить с цитированием
  #29 (permalink)  
Старый 03.01.2016, 20:42
Интересующийся
Посмотреть профиль Найти все сообщения от googlecallback
 
Регистрация: 03.01.2016
Сообщений: 18

Яростный Меч,

Да, я наверное, плохо ознакомился, частично я не прав, тем не менее.

Классы нельзя считать первоклассными сущностями уже потому, что их протокол отличается от объектного. В них нельзя иметь проперти. Насколько я подозревю, ими нельзя манипулировать с помощью Object.defineProperty, так? Они, вероятно, не поддерживают проксирование. Сабклассинг неуклюж, всегда надо забивать голову оверррайдами. Требуют строгого режима. Если там копнуть глубже, всплывет еще куча дерьма.

Все равно при "классовом" подходе теряется гибкость. Я могу на коленке реализовать такие классы за пять минут, но могу и другие, с другой семантикой, ничего это не дает, по сути, просто еще один костыль.
Ответить с цитированием
  #30 (permalink)  
Старый 03.01.2016, 20:48
Интересующийся
Посмотреть профиль Найти все сообщения от googlecallback
 
Регистрация: 03.01.2016
Сообщений: 18

Яростный Меч,
Единственное ощутимое преимущество -- эт унификация кода в ынтырпрайзе. Но меня это не касается лично
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ссылка на объект через агрумент kuzroman Events/DOM/Window 4 03.11.2015 22:57
определение времени при событии mouseOver greenred Events/DOM/Window 1 13.02.2012 23:28
как заполнить объект через цикл? daniel20 jQuery 1 29.12.2011 11:22
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37
XMLHTTPRequest передача имя через POST dds AJAX и COMET 0 14.08.2008 14:44