The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Утверждён стандарт ECMAScript 6"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Утверждён стандарт ECMAScript 6"  +/
Сообщение от opennews (ok) on 17-Июн-15, 22:24 
На очередном собрании Генеральной Ассамблеи ECMA (http://www.ecma-international.org/memento/GA.htm) официально утверждён (http://www.ecma-international.org/news/index.html) стандарт ECMAScript 2015 (http://www.ecma-international.org/ecma-262/6.0) (PDF (http://www.ecma-international.org/ecma-262/6.0/ECMA-262.pdf)), более известный как ECMAScript 6 или "ECMA-262 6th edition".

ECMAScript 6 продолжает линейку стандартов, определяющих базовые функциональные возможности JavaScript, реализованные для всех web-браузеров. Прошлый стандарт ECMAScript 5 был принят в 2009 году, а позапрошлый в 1999 году. Долгое время развитие стандарта было заморожено из-за  трудноразрешимых разногласий среди производителей браузеров, одни из которых выступали за внесение значительных изменений в JavaScript, а другие настаивали на сохранении полной семантической совместимости.

Основные нововведения ECMAScript 6:

-  Поддержка классов и деструкторов. Например (https://github.com/GoogleChrome/samples/tree/gh-pages/classe...):

<font color="#461b7e">
  class Polygon {
    constructor(height, width) {
       this.name = 'Polygon';
       this.height = height;
       this.width = width;
    }

    sayName() {
       log('Hi, I am a ', this.name + '.');
    }
  }

  let p = new Polygon(300, 400);

</font>


-  Шаблоны строк, предоставляющие удобные средства для форматирования строк. Шаблоны строк являются строковыми литералами, допускающими встраивание выражений. Выражения определяются в размещённом внутри строки блоке ${...}, который может включать как отдельные переменные (${name}), так и выражения (${5 + a + b})). Например, в результате выполнения "var message = '1 + 1 = ${1 + 1}'" в переменную будет записана строка "1 + 1 = 2";

-  Поддержка лексических объявлений переменных (Lexical Declarations (https://github.com/GoogleChrome/samples/tree/gh-pages/lexica...)), позволяющих ограничить текущим блоком область видимости ключевых слов, через их повторное определение при помощи выражения let вместо var (пример (https://github.com/GoogleChrome/samples/blob/gh-pages/lexica...));
-  Тип Symbol (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...), применимый для идентификаторов свойств объектов;
-  Генераторы,  позволяющие организовать эффективное выполнение функций в асинхронном режиме. Генераторы представляют собой специальные функции, генерирующие итераторы. Использование выражения yield для генератора, позволяет приостановить его выполнение и вернуть управление вызвавшей генератор функции. Особенность генераторов состоит в том, что последующие вызовы будут использовать предыдущее состояние и продолжат выполнение  кода генератора с того места, где он был приостановлен.

-  Оператор 'let (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...)' для определения локальной области видимости переменной, ограниченной пределами текущего блока;
-  Объект WeakSet (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...), позволяющий определить множество из объектов, в котором применяются  эффективные с точки зрения потребления памяти структуры, использующие сборщик мусора для удаления неиспользуемых объектов (объект удаляется, если на него больше не осталось ссылок, кроме ссылки из текущей коллекции);
-  Cтруктурs данных Map (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ma...) и Set (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-se...), упрощающих (http://updates.html5rocks.com/2014/08/Collecting-and-Iterati...) работу со специфичными типами коллекцией. Map позволяет определять коллекции наборов в формате ключ/значение, при том, что в качестве ключа и значения могут выступать любые выражения JavaScript. По аналогии Set позволяет задать множество любых выражений JavaScript;


URL: https://mail.mozilla.org/pipermail/es-discuss/2015-June/0432...
Новость: http://www.opennet.dev/opennews/art.shtml?num=42450

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


9. "Утверждён стандарт ECMAScript 6"  +9 +/
Сообщение от Аноним (??) on 17-Июн-15, 23:03 
Замечаю в последнее время как Джависты переходя на JS, тащят с собой весь свой легаси-абстрактный-бред вроде DAO с кучей не делающего ничего кода
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

37. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 06:30 
А как у них может получаться тащить его с собой, они что переписывают этот код на JS, или считают удобным как-то запускать яву из яваскрипта?
Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

62. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от КО on 18-Июн-15, 17:22 
GWT
Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

70. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 23:26 
да, переносят свой мега-абстрактный код на JS,
Фабрики там другую хрень, без понимания а нужна ли она в JS, в динамическом языке
Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

78. "Утверждён стандарт ECMAScript 6"  +3 +/
Сообщение от Crazy Alex (ok) on 19-Июн-15, 03:56 
Их нужность зависит не от языка, а больше от размеров проекта. В смысле - это устоявшийся, показавший совю применимость метод создания большого софта. Ка в плане написания так и способа думать о нём так, чтобы голова не взрывалась. И когда в браузер приходит что-то соответствующих объёмов - приходится всё это дело применять.

В сущности, чем больше проект - тем больше вреда от всяческой динамичности и больше пользы - от явно описанного всего и вся.

Ответить | Правка | ^ к родителю #70 | Наверх | Cообщить модератору

79. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Другой аноним on 19-Июн-15, 09:25 
> Замечаю в последнее время как Джависты переходя на JS, тащят с собой
> весь свой легаси-абстрактный-бред вроде DAO с кучей не делающего ничего кода

Нет, не переходят, но добавляют в свой инструментарий ;-)
Кхм, по моему DAO одна из самых естесственных вещей среди прочих паттернов, Вы так или иначе будете его использовать при работе с данными, а называть можете как угодно )))

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 17-Июн-15, 23:28 
>>Поддержка абстракции массивов (Array comprehensions), дающих возможность создания нового массива на основе другого массива;

Эту python-фичу в следующую версию планируют. ES7, правда её обещают выпустить гораздо оперативнее чем ES5 -> ES6, поживём увидим.

>>This is an experimental technology, part of the Harmony (ECMAScript 7) proposal.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 00:13 
Что, целочисленных типов так и не ввели? Зря. В Lua вон уже есть.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

87. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от AlexYeCu (ok) on 21-Июн-15, 15:02 
>Что, целочисленных типов так и не ввели? Зря. В Lua вон уже есть.

Разработчик LuaJIT сказал, что для новой версии Lua ничего делать не будет: лэнгвич форкд, все в лес. Так что уже неважно, чего там в lua есть: важно, что последними версиями пользоваться проблематично на текущий момент.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

15. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 01:07 
С такими map, для которых get/set надо писать, пусть они пройдут лесом, а дальше полем. Покосят травы, покурят и оставят IT кому-нибудь другому.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

16. "Утверждён стандарт ECMAScript 6"  –3 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 01:17 
Я что-то не понял щито тебя не устраивает? В обычных map тоже get/set есть и что?
Или это ты так примера с ClearableWeakMap испугался? Так это пример как прикрутить сбоку то, что не сильно-то и нужно.
Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

20. "Утверждён стандарт ECMAScript 6"  +5 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 01:57 
Меня бесит это убогое джавовское многословие. Нормальный вариант использовал бы квадратные скобки. Я в курсе, что в JS так пропертя JS-объекта адресуются - но по-моему это решаемый вопрос. А ещё лучше - если бы мапу не вводили вообще, а наделили её свойствами пустой объект, который {}. И для set сделали бы интерфейс как для булевой мапы, т.е. чтобы можно было писать if (mySet['x'])... А так - единственным преимуществом JS как языка (ну, кроме того, что в вебе ему альтернатив нет) была относительная компактность. И они её зачем-то гробят.
Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

32. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 03:25 
И как предлагаешь объявлять WeakMap если наделить пустой объект свойствами обычного Map? А так у нас общий синтаксис между ними и даже Set и WeakSet, и он никак не перегружает обычные объекты мусором, который там даром никому не нужен.

Кстати, с текущим синтаксисом has можно сделать вот так:
let a = new Set(['a','b']), b = ['a','c','b'];
console.log(b.map(a.has,a)); // >> Array [ true, false, true ]

В реальных же недостатках то, что нужно указывать контекст работы, что делает такой вызов этих функций существенно менее гибким, чем хотелось бы. Например, нельзя сделать так:
let a = new Set(['a','c']), b = new Set(['b','d']), c = {one:a.has,two:b.has};
c['one']('a'); //TypeError: has method called on incompatible Object
Можно, конечно, сделать c = {one:x => a.has(x),two:x => b.has(x)}, но проще уже сделать c = {one:a,two:b} и потом вызывать c['one'].has('a');
Да и в предыдущем примере без контекста (",a") код падает с ошибкой.

Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

51. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 13:28 
Да масса вариантов, как объявлять - один хрен это магия движка, а не библиотечные классы. Например, obj = WeakMap.transform(obj);

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

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

55. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 13:56 
а если историю про Dart вспомнить? подвижка конечно хорошая, но лишь бы до масс дошло
Ответить | Правка | ^ к родителю #51 | Наверх | Cообщить модератору

74. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Crazy Alex (ok) on 19-Июн-15, 03:26 
Разница очень проста. Дарт - это был только гугл. Здесь - гугл, мозилла и майкрософт.
Ответить | Правка | ^ к родителю #55 | Наверх | Cообщить модератору

21. "Утверждён стандарт ECMAScript 6"  +6 +/
Сообщение от _Vitaly_ (ok) on 18-Июн-15, 02:00 
cинтакcиc не юзабельный
Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

26. "Утверждён стандарт ECMAScript 6"  +3 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 02:32 
О, там совсем круто - оно даже в JSON не экспортируется обычным JSON.stringify. Я уже представляю новую версию jquery, которая будет костылить преобразование, скармливая свой replacer... Ну вот неужели они вообще никак не задумывались о том, как оно будет применяться?
Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

34. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 03:51 
А то, что WeakMap и WeakSet оперируют объектами и то, что у объектов могут быть приватные свойства, которые JSON.stringify всё одно потеряет, тебя не смущает? Оно не предназначено для экспорта в JSON. Более того, если тебя угораздит объявить WeakSet объектами, на которые никто более не ссылается (при обратной сборке из JSON именно это и случится ведь), то после первой же сборки мусора он у тебя станет пустым.
Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

50. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 13:24 
Конечно смущает. По уму - должен быть штатный механизм, позволяющий прибить к объекту (а не к сериализатору) логику сериализации.
Ответить | Правка | ^ к родителю #34 | Наверх | Cообщить модератору

58. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 16:00 
Штатного метода сериализации объектов не существует хотя бы потому, что они могут находиться в неопределённом состоянии, ожидая возврата данных извне, или состояние может зависеть от времени и возможно, что его нельзя просто поднять из снапшота, а нужна какая-то реинициализация. Т.е. корректный сериализатор/десериализатор может написать только сам автор объекта. Потому и решили не заморачиваться.

Ну а в случае с WeakMap/WeakSet, как я уже говорил, восстановление из снапшота просто не имеет смысла. На объекты должны существовать ссылки извне, а иначе они будут автоматически выброшены на этапе сборки мусора.

Ответить | Правка | ^ к родителю #50 | Наверх | Cообщить модератору

75. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от Crazy Alex (ok) on 19-Июн-15, 03:37 
Дык, я о чём? Именно автор объекта. И этот сериализатор должен быть автоматом задействован - благо, как - давно понятно - если у объекта объявлен соответствующий метод - допустим, serialize - то вызывать его. Если нет - то валимся с ошибкой, если не указан replacer. Вот это было бы корректным поведением, защищающим от ошибок по невнимательности. Для Map приемлемым решением была бы сериализация в JSON-объект, для Set - в массив или в какой-нибудь специализированный вариант JSON-объекта.
Для Weak вариантов - восстановление-то смысла не имеет, а вот сериализация - вполне. Ну да, это думать надо - ну так вот из подобного и складывается удобство языка.

Ну ладно, теперь это будет реализовано (поведение-то совершенно очевидное) в очередном jQuery, делов-то. С кучей проверок типов и вообще наверняка неоптимально. Ну да тем, кто на JS пишет, не привыкать.

Ответить | Правка | ^ к родителю #58 | Наверх | Cообщить модератору

17. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от Jason (??) on 18-Июн-15, 01:32 
Не очень понимаю, зачем нужны классы, если они и так де-факто присутствуют. Javascript же prototype-based уже. Чем class newClass{constructor()} удобнее, чем function Class(){}? Неужели только тем, что первый метод - буквальнее? Все равно расширять, добавлять методы и т.п. придется через someClass.prototype. Или у этих новых классов есть какие-то еще крутые фичи?
Не понимаю зачем нарушать дзен функционального минимализма и превращать JS в монстра типа PHP.

Помогите разобраться, чего я недопонял?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

19. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 01:55 
Строго говоря смысла делать new func тоже нет.

Можно (и даже нужно) писать так:

let Polygon = {
  create: function(height, width) {
    let self = Object.create(this);
    self.name = 'Polygon';
    self.height = height;
    self.width = width;
    return self;
  },
  sayName: function() {
    return 'Hi, I am a ' + this.name + '.';
  }
}

let p = Polygon.create(300, 400);
console.log(p.sayName());

Это то, как изначально задумывалось работа с объектами в JS.
А new func только проблемы создаёт. Особенно если случайно забыть написать new. При таком же подходе это просто невозможно.

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору
Часть нити удалена модератором

35. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 04:23 
> Секта свидетелей жабы, ваши вызовы функций обросии жиром со всех сторон…

А теперь создадим новый объект и расширим его, добавив функцию площади:

let AreaPolygon = Object.create(Polygon);
AreaPolygon.area = function(){return this.height * this.width};

let p = AreaPolygon.create(300,400);
console.log(p.sayName());
console.log(p.area());

Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

45. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 11:52 
ok.

а как в вашем примере переопределить метод-функцию класса-объекта, при это вызвав этот же метод родителя?

пример псевдокод:
AreaPolygon () {
    sayName: function() {
        return "It's " + super().sayName() + " & AreaPolygon";
  }
}

Ответить | Правка | ^ к родителю #35 | Наверх | Cообщить модератору

57. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 15:20 
> ok.
> а как в вашем примере переопределить метод-функцию класса-объекта, при это вызвав этот
> же метод родителя?

Не уверен, что это корректный способ, но лично я сделал бы вот так:

AreaPolygon.sayName = function() {
return Polygon.sayName.call(this) + " My area is " + this.area() + " of square something."
}

Хотя, конечно, можно было бы сделать AreaPolygon.parent = Polygon и потом просто дёргать this.parent.sayName(). Зависит от того нужно ли тебе свойство parent или нет.

Впрочем, с наследованием новых свойств от объекта-родителя наличие/отсутствие такого полня проблемы не создаёт:

Polygon.setName = function(name) {this.name = name}
p.setName('Rectangle'); // p тут объект класса AreaPolygon
console.log(p.sayName())

Ответить | Правка | ^ к родителю #45 | Наверх | Cообщить модератору

59. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 16:25 
твой пример не работает, ну а трансляторы генерируют в два раза больше кода если в стиле ES5

https://babeljs.io/repl/#?experimental=true&evaluate=true&lo...

Ответить | Правка | ^ к родителю #57 | Наверх | Cообщить модератору

61. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 16:52 
У меня в консоли фокса так:
<<
let Polygon = {
  create: function(height, width) {
    let self = Object.create(this);
    self.name = 'Polygon';
    self.height = height;
    self.width = width;
    return self;
  },
  sayName: function() {
    return 'Hi, I am a ' + this.name + '.';
  }
}

let AreaPolygon = Object.create(Polygon);
AreaPolygon.area = function(){return this.height * this.width};

let p = AreaPolygon.create(300,400);

AreaPolygon.sayName = function() {
  return Polygon.sayName.call(this) + " My area is " + this.area() + " of square something."
}

Polygon.setName = function(name) {this.name = name}
p.setName('Rectangle');
console.log(p.sayName())

>> "Hi, I am a Rectangle. My area is 120000 of square something."

А пример с parent — похоже я что-то напутал. Всё одно нужно вызывать через "sayName.call(this)"
Кстати, мой код может не работать из-за let в Хроме. Там есть ограничения где он сейчас работает.

Ответить | Правка | ^ к родителю #59 | Наверх | Cообщить модератору

64. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 17:55 
var Polygon = {
  create: function(height, width) {
    let self = Object.create(this);
    self.name = 'Polygon';
    self.height = height;
    self.width = width;
    return self;
  },
  sayName: function() {return 'Hi, I am a ' + this.name + '.'},
  setName: function(name) {this.name = name}
}

var AreaPolygon = Object.create(Polygon);
AreaPolygon.predoc = Polygon;
AreaPolygon.area = function(){return this.height * this.width};
AreaPolygon.sayName = function() {
  return this.predoc.sayName.call(this) + " My area is " + this.area() + " of square something."
}

var ap = AreaPolygon.create(300,400);
ap.setName('Rectangle');

console.log(ap.sayName())

Да выше работает, но удобнее один раз указать родителя для объекта и потом на него ссылаться.


А вот если объект вместо Ява-стайл сеттеров и геттеров, то тут становится уже сложнее, по крайне мере навскидку решение мне не приходит в голову:

var Polygon = {
  create: function(height, width) {
    let self = Object.create(this);
    self.name = 'Polygon';
    self.height = height;
    self.width = width;
    return self;
  },
  get pname() {return 'Hi, I am a ' + this.name + '.'},
  set pname(name) {this.name = name}
}
...

Есть что предложить?

Ответить | Правка | ^ к родителю #61 | Наверх | Cообщить модератору

68. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 18:57 
Вот такое вот получилось:

var AreaPolygon = Object.create(Polygon);
AreaPolygon.p = Polygon;
AreaPolygon.area = function(){return this.height * this.width};
Object.defineProperty(AreaPolygon, 'pname', {
  set: function(name) {this.p.__lookupSetter__('pname').call(this,name)},
  get: function() {
         return this.p.__lookupGetter__('pname').call(this) + ' My areas is '+this.area()+' square something.'
  },
  configurable:true}); // configurable - возможность изменять/переопределять

var p = AreaPolygon.create(100,200);
p.pname = 'Rectangle';
console.log(p.pname);

>> "Hi, I am a Rectangle. My areas is 20000 square something."

Ответить | Правка | ^ к родителю #64 | Наверх | Cообщить модератору

80. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 19-Июн-15, 11:38 
ага, интересно. Единственное на сайте developer.mozilla.org/ru/docs/Web/JavaScript
__lookupGetter__ объявлен устаревшим и не эквивалентно работающим в разных браузерах, рекомендуют getOwnPropertyDescriptor


var AreaPolygon = Object.create(Polygon);
AreaPolygon.p = Polygon;
AreaPolygon.area = function(){return this.height * this.width};

Object.defineProperty(AreaPolygon, 'pname', {
  set: function(name) {
      name = ' BIG ' + name;
      Object.getOwnPropertyDescriptor(this.p, 'pname')['set'].call(this, name)
  },      
  get: function() {
         return Object.getOwnPropertyDescriptor(this.p, 'pname')['get'].call(this) + ' My areas is '+this.area()+' square something.'
  },
});

var p = AreaPolygon.create(300,450);
p.pname = 'Rectangle';
console.log(p.pname);

>> Hi, I am a  BIG Rectangle. My areas is 135000 square something.

Есть так же в Object.defineProperty(obj, 'key', {
  __proto__: null

но функциональность __proto__ и его полезность опробовать не получилось.

Ответить | Правка | ^ к родителю #68 | Наверх | Cообщить модератору

82. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Lain_13 (ok) on 19-Июн-15, 13:08 
> __lookupGetter__ объявлен устаревшим и не эквивалентно работающим в разных браузерах, рекомендуют getOwnPropertyDescriptor

Надо будет запомнить. Спасибо. Кстати, вместо ['set'] и ['get'] можно писать просто .set и .get. Если возникнет необходимость передать неопределённое множество параметров, то вместо .call(this,arg1,arg2,...) можно использовать .apply(this,arguments).

> Есть так же в Object.defineProperty(obj, 'key', {
>   __proto__: null
> но функциональность __proto__ и его полезность опробовать не получилось.

Им рекомендуют без крайней нужды не пользоваться в виду проблем с производительностью: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...

К тому же при данном подходе к созданию объектов у них нет прототипов и свойство obj.prototype отсутствует.

Ответить | Правка | ^ к родителю #80 | Наверх | Cообщить модератору

83. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 19-Июн-15, 15:16 
ок, благодарю полезный тред получился.
Ответить | Правка | ^ к родителю #82 | Наверх | Cообщить модератору

63. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Lain_13 (ok) on 18-Июн-15, 17:39 
А вот вариант твоего кода без классов:
var Creature = {
  create: function(name) {
    var self = Object.create(this);
    self.type = name;
    return self;
  },
  descr: function() {
    return " GIANT " + this.type;
  }
}
var Fish = Object.create(Creature);
Fish.create = function(name) {
  var self = Creature.create.call(this, '6 meter long '+name);
  self.name = name;
  return self;
}
Fish.descr = function() {
  return "It was" + Creature.descr.call(this);
}

var fish = Fish.create("shark");

console.log(fish.descr());

Он конечно немного жирнее будет, но не так же, как это сделал Babel.

Ответить | Правка | ^ к родителю #59 | Наверх | Cообщить модератору

65. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 18:01 
>[оверквотинг удален]
>   self.name = name;
>   return self;
> }
> Fish.descr = function() {
>   return "It was" + this.parent.descr.call(this);
> }
> var fish = Fish.create("shark");
> console.log(fish.descr());
> Он конечно немного жирнее будет, но не так же, как это сделал
> Babel.

ага, не увидел сразу твой ответ, сам примерно так написал выше.

Ответить | Правка | ^ к родителю #63 | Наверх | Cообщить модератору

71. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Алконим on 19-Июн-15, 02:27 
AreaPoligon.sayName=function(super) { return function() { return "It's" +super()+"& AreaPolygon"; }}(Polygon.sayName);
Ответить | Правка | ^ к родителю #45 | Наверх | Cообщить модератору

22. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 02:06 
навскидку:
- нельзя вызвать напрямую, без new - частая и тупая ошибка с function Class.
- геттеры/сеттеры там же
- наследование через extends, так что prototype не при делах.
Плюс всякие расширенные возможности вроде итераторов.

Если коротко - то да, буквальнее. Всегда хорошо, когда синтаксис совпадает с семантикой, меньше голова мусором забивается.

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

25. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Jason (??) on 18-Июн-15, 02:13 
Ребята, спасибо!

P.S.: Про extends - действительно, напоминает монстра PHP.

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

27. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 02:33 
Минимализм хорош в минималистичных программах, а когда у тебя кода столько, что минифицированным получается два мегабайта - то лучше когда как пишется, так и читается.
Ответить | Правка | ^ к родителю #25 | Наверх | Cообщить модератору

43. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 10:36 
Я конечно понимаю что js применяют где попало и не совсем по назначению, но всё таки 2Мб. наводит на нехорошие мысли.

p.s. С тем что лучше как пишется так и читается, полностью согласен :)

Ответить | Правка | ^ к родителю #27 | Наверх | Cообщить модератору

52. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 13:30 
Посмотри, сколько весят какие-нибудь гуглодоки, или морда групвари. Да и на обычных сайтах бывает - особенно на чём-то вроде газет, где тянется куча стороннего кода - партнёры, реклама, трекеры и т.д. Просто если оно тащится не одновременно объём не слишком заметен, но в общем кодовая база, которая должна как-то совместно работать немаленькая.
Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

23. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 02:09 
Что-то у меня сильное подозрение, что теперь они в седьмой версии смогут с чистой совестью задепрекейтить прототипы, так как их никто не будет использовать кроме пары упрямцев. У них было ровно два применения, насколько я видел - рискованные извращения с существующими объектами вроде того, что творил Prototype и, собственно, эмуляция классов. Или есть ещё какие-то примеры где оно действительно надо?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

28. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Jason (??) on 18-Июн-15, 02:57 
Для этого нет никаких причин. Prototype- и Class based OOP - две разные парадигмы. Каждая из них имеет плюсы и минусы и будет использована умным программистом в соответствии с задачей. Если, конечно, он умеет пользоваться инструментом и руки растут откуда надо.

Навскидку: http://programmers.stackexchange.com/questions/110936/what-a...

И как справедливо замечено по ссылке, "the main advantage of prototype-based OOP its that objects & "classes" can be extended at runtime".

Еще:

http://stackoverflow.com/questions/816071/prototype-based-vs...
http://stackoverflow.com/questions/879061/what-are-the-advan...

Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

29. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 03:12 
Ну, об этом "advantage" я упоминал - и в конце концов стало общепризнанным, что Prototype.js, который на этом построен - плохая штука. Как бы не в 99% случаев любые фокусы вроде "extended in runtime" - это поиск проблем в поддержке. И вот то, что в этом ответе перечисляется - как раз оно. Это аргументы хакера, который в одиночку колдует над хитрым кодом, понятным только ему, причём понятным полностью.

Я так понимаю, что JS перерос прототипную модель. Когда тебе нужен сравнительно мелкий скрипт - можно написать какой угодно гениальный код. Но когда у тебя большое приложение или куча third party компонент (а сейчас на сайте десяток чужих библиотек подтянуть - норма, причём они постоянно меняются) - игры с прототипами становятся слишком рискованными.

Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

38. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от freehck email(ok) on 18-Июн-15, 07:47 
Эдак Вы дойдёте до утверждения, что любое порождение процедуры ли, объекта или просто выполнение eval - моветон. Но это не так. Существуют задачи, решение которых существенно упрощается при таком подходе. Например, это задачи символьного исчисления, программирования AI.

> ... то, что в этом ответе перечисляется - ... это аргументы хакера, который в одиночку колдует над хитрым кодом, понятным только ему ...

Область применения пораждает пользователей языка, а пользователи - требования к нему. Я тут хочу заметить, что языки производятся, исходя из требований, которые диктуются не областью применения и даже не сложностью решаемых задач. Они диктуются пользователями языка и их возможностями осваивать и применять технологию.

Если бы все программисты могли бы быть хакерами, высококлассными it-специалистами, то сейчас бы у нас было засилье лиспов и т.п., как наиболее мощных по выразительности языков, ныне существующих. А тут - имеем, что имеем. Поэтому когда Вы говорите "общепризнанно, что xxx - плохая штука", надо ясно понимать, что этот подход был "не оправдан для данной области применения". Ничто не гарантирует, что этот же подход не найдёт применения в другой области.

Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

44. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Аноним (??) on 18-Июн-15, 10:41 
> Эдак Вы дойдёте до утверждения, что любое порождение процедуры ли, объекта или
> просто выполнение eval - моветон. ...

До того что нужно заменить js на java с ограниченным набором core библиотек.

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

85. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от freehck email(ok) on 20-Июн-15, 01:29 
>> Эдак Вы дойдёте до утверждения, что любое порождение процедуры ли, объекта или
>> просто выполнение eval - моветон. ...
> До того что нужно заменить js на java с ограниченным набором core
> библиотек.

Ох, да делайте, что хотите с этой Вашей ненаглядной явой. Только мне не сватайте.

Ответить | Правка | ^ к родителю #44 | Наверх | Cообщить модератору

53. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Crazy Alex (ok) on 18-Июн-15, 13:40 
Вот насчёт "Существуют задачи, решение которых существенно упрощается при таком подходе. Например, это задачи символьного исчисления, программирования AI" - можно подробнее? Это, собственно, то, о чём я спрашивал - есть ли реальные применения, где прототипы таки дают хороший выигрыш?

> Область применения порождает пользователей языка, а пользователи - требования к нему.

Именно. И, соответственно, требования диктуются именно областью применения. А под неё уже подбираются программисты, желающие и способные в ней работать. Если у нас большая объектная модель (допустим, тот же гуглодок) - то нужно что-то, что даст возможность эту объектную модель реализовать с вменяемой эффективностью - в смысле стоимости разработки и поддержки, и чтобы на выходе было что-то, чем можно пользоваться.

И именно область применения поменялась, объёмы кода выросли, появилась необходимость в такой же поддержке, как и для "взрослых" приложений. И все требования, отсюда вытекающие.

Ладно, я, кажется, погорячился с предсказанием - в свете сегодняшней новости скорее JS через пару лет в основном уйдёт из веба.

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

84. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от freehck email(ok) on 20-Июн-15, 01:27 
> Вот насчёт "Существуют задачи, решение которых существенно упрощается при таком подходе.
> Например, это задачи символьного исчисления, программирования AI" - можно подробнее? Это,
> собственно, то, о чём я спрашивал - есть ли реальные применения,
> где прототипы таки дают хороший выигрыш?

Ну, тут весь вопрос, выигрыш в чём именно Вас интересует. В производительности - обычно нет. В выразительной силе и возможностях - да. Именно благодаря возможности генерировать код в рантайме появились возможность символьных вычислений и CLOS. Макросы чтения и записи, как логичное развитие этой идеи.

Вообще говоря, порождение объекта как прототипа и генерация кода на лету - явления родственные. Поэтому я мог бы предложить Вам как пример, для начала, смотреть на Maxima, где эти возможности, должно быть, очень широко используются.

Если же Вас интересует именно вопрос прототипирования объектов, то я видел применение данного подхода в ДОЗОР СМАП [1]. Там при анализе сообщений объекты новых типов с произвольным набором полей, порождаются на лету. Довольно увлекательное зрелище. К сожалению, продукт закрытый, но вообще говоря, в проекте используется много GPL-лицензированного кода, так что при желании можно извернуться и получить исходники. Надеюсь.

[1] http://solarsecurity.ru/products/solar_dozor/

>> Область применения порождает пользователей языка, а пользователи - требования к нему.
> Именно. И, соответственно, требования диктуются именно областью применения. А под неё уже
> подбираются программисты, желающие и способные в ней работать. Если у нас
> большая объектная модель (допустим, тот же гуглодок) - то нужно что-то,
> что даст возможность эту объектную модель реализовать с вменяемой эффективностью -
> в смысле стоимости разработки и поддержки, и чтобы на выходе было
> что-то, чем можно пользоваться.

Чтобы на выходе было что-то, чем можно пользоваться, всегда можно нанять стайку мартышек. И средства реализации большой объектной модели - это вовсе не то, на чём она зиждится. Чтобы построить хороший большой программный комплекс нужны не программисты - это дело десятое. Прежде всего нужен архитектор. Грамотный, скурпулёзный, и желательно - один.

> И именно область применения поменялась, объёмы кода выросли, появилась необходимость в
> такой же поддержке, как и для "взрослых" приложений. И все требования,
> отсюда вытекающие.

Я пока что отношусь к JS, как к языку для модификации DOM-а в моём браузере. Впрочем, может Вы и правы? Транслируют же в JS всякие странные вещи, типа игры Quake. Возможно, он способен на большее.

> Ладно, я, кажется, погорячился с предсказанием - в свете сегодняшней новости скорее
> JS через пару лет в основном уйдёт из веба.

Это вряд ли. Очень много кода написано. Не выбросят же его. Так и потянется легаси через десятилетия.

Ответить | Правка | ^ к родителю #53 | Наверх | Cообщить модератору

72. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Алконим on 19-Июн-15, 02:34 

> Если бы все программисты могли бы быть хакерами, высококлассными it-специалистами, то сейчас
> бы у нас было засилье лиспов и т.п.,

JavaScript - это Lisp(Scheme) с синтаксисом похожим на Java.

A company called Netscape was founded in 1994 and created one of the first web browsers. They recruited Eich in 1995, because they wanted him to create a programming language for that web browser. The lure for him was that he would be able to base the language on Scheme (a Lisp dialect). Scheme’s influence led to JavaScript having closures. Another influence was the prototype-based programming language Self which is responsible for JavaScript’s prototypal inheritance (some of the elegance of this approach is hidden by JavaScript’s muddled adoption of it). Next, Java got included in the browser. It quickly gained popularity and influenced Netscape’s decisions regarding JavaScript.

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

86. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от freehck email(ok) on 20-Июн-15, 01:37 
>> Если бы все программисты могли бы быть хакерами, высококлассными it-специалистами, то сейчас
>> бы у нас было засилье лиспов и т.п.,
> JavaScript - это Lisp(Scheme) с синтаксисом похожим на Java.

Спасибо, не знал. Впрочем, если весь JS - это синтаксический сахар для того, чтобы быть похожим на C-подобные языки, типа Java; то я бы предпочёл осуществить преобразование JS в sexp-ы и уже напрямую с ними работать. Смотреть на Java-подобный код мне очень не удобно.

Надо полагать, этот сахар был сделан для того, чтобы завоевать широкую аудиторию C-программистов привычным синтаксисом, а также упростить себе задачи оптимизации компиляции, обеспечив себя плюсами лиспав (макросами, AST и т.д.). Почему бы и нет.

Ответить | Правка | ^ к родителю #72 | Наверх | Cообщить модератору

73. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Алконим on 19-Июн-15, 02:37 
> Если бы все программисты могли бы быть хакерами, высококлассными it-специалистами, то сейчас
> бы у нас было засилье лиспов и т.п., как наиболее мощных

http://www.crockford.com/javascript/little.html

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

67. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от _Vitaly_ (ok) on 18-Июн-15, 18:57 
Ну на ходу перековыривать прототипы это действительно полный ахтунг. А вот растягивать ленивую инициализацию миксинов очень даже удобно. На классах все что связано с миксинами будет менее удобно делать.

В яваскрипте просто тормозов маловато, а самодисциплины не у всех хватает. Если взять исходники на руби, можно увидеть что там авторов тоже часто заносит в космос. По аналогичной причине.

Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

76. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Crazy Alex (ok) on 19-Июн-15, 03:49 
Ну вот для больших проектов это отсутствие тормозов - лишний риск.

Что до миксинов - да, объектную систему ввели хиленькую, а миксины чтобы в ней были - нужно либо множественное наследование либо их поддержка в явном виде. Лениво, впрочем, ни так, ни так не будет, хотя я не очень понимаю, зачем - но вполне возможно, что где-то и нужно.

Ответить | Правка | ^ к родителю #67 | Наверх | Cообщить модератору

31. "Утверждён стандарт ECMAScript 6"  +3 +/
Сообщение от Аноним (??) on 18-Июн-15, 03:17 
> Например, в результате выполнения "var message = '1 + 1 = ${1 + 1}'" в переменную будет записана строка "1 + 1 = 2";

Новый класс уязвимостей, javascript инъекции?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

39. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 08:46 
Новый? А XSS разве не javascript injection?
Ответить | Правка | ^ к родителю #31 | Наверх | Cообщить модератору

36. "Утверждён стандарт ECMAScript 6"  +4 +/
Сообщение от Аноним (??) on 18-Июн-15, 05:46 
Осталось подождать каких-то лет 15-20, что бы у большинства пользователей были браузеры которые поддерживают шестерку. А то ведь браузеры как правило обновляют только когда винду переустанавливают... Oh shit! IE8.. IE9, IE10, IE11!
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

40. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от Аноним (??) on 18-Июн-15, 08:48 
Вы из какого года? Chrome + firefox это уже большинство браузеров. А до поддержки ECMAScript 6 они сами обновятся.
Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

41. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 08:59 
Большинство - не все. В требованиях любого коммерческого продукта - поддержка IE как минимум 10. Это в лучшем случае. А по факту - практически везде нужно поддерживать IE8.
Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

47. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от й email on 18-Июн-15, 12:07 
> Большинство - не все. В требованиях любого коммерческого продукта - поддержка IE
> как минимум 10. Это в лучшем случае. А по факту -
> практически везде нужно поддерживать IE8.

девятка уже два года даже гуглом не поддерживается. восьмёрка -- три года.

ну, нахрена сайту в 2015 году поддерживать устаревший веб-браузер, на котором я даже gmail запустить не могу?

более того: нахрена такой браузер пользователям? вот они и ставят хром.

Ответить | Правка | ^ к родителю #41 | Наверх | Cообщить модератору

48. "Утверждён стандарт ECMAScript 6"  +3 +/
Сообщение от й email on 18-Июн-15, 12:11 
да и вообще ie 8-9 -- это windows xp, vista и необновлённая семёрка без сервис-пака. эти все три системы уже давно EOL. добро пожаловать в 2015 год.
Ответить | Правка | ^ к родителю #47 | Наверх | Cообщить модератору

54. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 13:42 
Тем не менее их используют и отключив их поддержку можно нажить себе проблем.
Ответить | Правка | ^ к родителю #48 | Наверх | Cообщить модератору

69. "Утверждён стандарт ECMAScript 6"  +1 +/
Сообщение от fi (ok) on 18-Июн-15, 19:10 
Смешной вы человек из каменного века :)  ишака вспомнили.

Мы делаем так:
< h1 > Данная версия браузера не поддерживается! Используйте браузер Firefox версии 17 и выше.< / h1 >

Ответить | Правка | ^ к родителю #54 | Наверх | Cообщить модератору

66. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 18:54 
За домашних пользователей можно не беспокоиться. Но проект над которым мы недавно работали - предназначен для врачей прежде всего, а у них в больницах еще много где стоят машины с ХР на борту и IE8. Потому что по какой-то таинственной причине администраторы больниц запрещают ставить сторонний софт. Примечание: я говорю не об этой стране. Как это не было бы удивительно - но в США, даже в той же Калифорнии, в больницах XP+IE - не редкость.
Ответить | Правка | ^ к родителю #47 | Наверх | Cообщить модератору

77. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Crazy Alex (ok) on 19-Июн-15, 03:51 
Ну, значит для специализированных применений новые фичи пока не подойдут. Делов-то.
Ответить | Правка | ^ к родителю #66 | Наверх | Cообщить модератору

81. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от й email on 19-Июн-15, 13:06 
> а у них в больницах еще много где стоят машины с ХР на борту и IE8. Потому что по какой-то таинственной причине администраторы больниц запрещают ставить сторонний софт

удачи им при следующем security-аудите. с такой полиси они его с треском провалят.

Ответить | Правка | ^ к родителю #66 | Наверх | Cообщить модератору

42. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от kobezzza on 18-Июн-15, 09:36 
https://babeljs.io/
Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

49. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 12:37 
Напишут интерпретатор ECMAScript 6 на ECMAScript 5 сейчас это модно...
Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

46. "Утверждён стандарт ECMAScript 6"  +2 +/
Сообщение от Аноним (??) on 18-Июн-15, 11:55 
Фрактал ненужностей продолжает расти.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

56. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Аноним (??) on 18-Июн-15, 14:48 
Одно могу сказать - PHP явно не хуже JS/ES6.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

88. "Утверждён стандарт ECMAScript 6"  +/
Сообщение от Кир on 09-Сен-15, 12:13 
В смысле -- одинаково хреновые? Согласен.
Ответить | Правка | ^ к родителю #56 | Наверх | Cообщить модератору

60. "Утверждён стандарт ECMAScript 6"  –1 +/
Сообщение от lucentcode (ok) on 18-Июн-15, 16:27 
Отличная новость. Не знаю как в клиентском js, а для разработчиков под ноду классы, нейспейсы и прочие плюшки очень пригодятся.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру