Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   JS.next(стандарты, фичи, движки) (https://javascript.ru/forum/offtopic/50248-js-next-standarty-fichi-dvizhki.html)

Octane 27.07.2015 22:38

http://kangax.github.io/compat-table/es7/#babel

FINoM 27.08.2015 21:30

Господа, подскажите лучшие пути использования ES7 (или хотя бы ES6) на ноде. О node-babel знаю, но он почему-то не работает с forever (возможно, и со многими другими популярными инструментами). Пытаюсь освоить ноду (чтоб уметь фулл-стек), но пересаживаться на старый JS совсем неохота.

Не знал о require("babel/register"); вопрос не актуален

FINoM 14.09.2015 15:17

Ребят, кто-то в курсе, как импортить/экспортить AMD модули в Babel, без вставки бабелем проверок и "_interopRequireDefault"?
https://github.com/babel/babel/issues/2381 - вот тут пример кода, который я бы хотел получить в итоге.

Erolast 14.09.2015 15:22

Я бы предложил лучше перейти на common.js + webpack.

FINoM 14.09.2015 15:25

Цитата:

Сообщение от Erolast
Я бы предложил лучше перейти на common.js

Не люблю CJS из-за необходимости запускать вотчер.
Цитата:

Сообщение от Erolast
webpack

А он умеет импорт в стиле ES2015?

Lemme 14.09.2015 15:49

FINoM, конечно. Нужно лишь js файлы грузить через babel-loader

Erolast 14.09.2015 15:50

Цитата:

Не люблю CJS из-за необходимости запускать вотчер.
Не понял. Что за вотчер?

Цитата:

А он умеет импорт в стиле ES2015?
Можно. Вебпак - это сборщик с возможностью прекомпиляции ассетов. Для прекомпиляции ES6 (в том числе и модулей) с помощью babel существует babel-loader.

FINoM 14.09.2015 15:51

Цитата:

Сообщение от Lemme
FINoM, конечно. Нужно лишь js файлы грузить через babel-loader

Круто, но это не решит моей проблемы.

kobezzza 14.09.2015 17:52

Цитата:

Сообщение от FINoM (Сообщение 388590)
Ребят, кто-то в курсе, как импортить/экспортить AMD модули в Babel, без вставки бабелем проверок и "_interopRequireDefault"?
https://github.com/babel/babel/issues/2381 - вот тут пример кода, который я бы хотел получить в итоге.

Задай бабелю параметр компиляции модулей в AMD и все.

FINoM 14.09.2015 17:58

Цитата:

Сообщение от kobezzza
Задай бабелю параметр компиляции модулей в AMD и все.

Ты не понял, я хочу, чтоб экспорт и импорт был простым:
import X from 'x';
let y = new X();
export default y;

>>>
define(['x'], function(X) {
var y = new X();
return y;
});
Как включить AMD я знаю.

nerv_ 29.09.2015 16:55

Как сделать свойства перебираемыми при описании геттеров/сеттеров es6?
'use strict';

const __PROP = Symbol();

class Foo {
  constructor() {
    this.prop = 1;
  }
  get prop() {
    return this[__PROP];
  }
  set prop(value) {
    this[__PROP] = value;
  }
}

let bar = new Foo();

console.log(bar.prop); // 1
console.log(Object.keys(bar)); // []



Это возможно БЕЗ пронографии вида?
'use strict';


const __PROP = Symbol();


class Foo {
  constructor() {
    Object.defineProperty(this, 'prop', {
        enumerable: true,
        get() {
            return this[__PROP];
        },
        set(value) {
            this[__PROP] = value;
        }
    });
    this.prop = 1;
  }
}


let bar = new Foo()


console.log(bar.prop); // 1
console.log(Object.keys(bar)); // ["prop"]

FINoM 29.09.2015 17:01

nerv_, полагаю, никак. А в каких задачах ты юзаешь акцессоры, если не секрет?

nerv_ 29.09.2015 17:20

Цитата:

Сообщение от FINoM
А в каких задачах ты юзаешь акцессоры

много где :) Например, при работе с localStorage.

Допустим:
store.prop // читает из localStorage
store.prop = 1 // пишет в localStorage

FINoM 29.09.2015 17:47

nerv_, я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку. Сейчас функции, которые работают с объектами вынесены в небольшую либу, которая находится в папке /magic репки.
class Foo {
  constructor() {
    magic.on(this, 'change:prop', evt => localStorage.prop = this.prop);
  }
}


И не нужно городить огороды с символами.

trikadin 29.09.2015 19:14

nerv_, так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта. Если ты хочешь, чтобы оно было доступно именно в объекте, то придётся объявлять его на самом объекте, ничего не попишешь :С

Если у тебя таких свойств много -- сделай ф-цию, которая будет пробегать по obj.__proto__, находить все элементы, для которых Object.getOwnPropertyDescriptor возвращает объект, в котором есть геттер, и ставить их самому объекту. Это, конечно, тоже извращение, но хотя бы инкапсулированное извращение.

trikadin 29.09.2015 19:30

Во, меня проперло)

Посмотреть.

devote 30.09.2015 00:12

'use strict';

const __PROP = Symbol();

class Foo {
  constructor() {
    Object.getOwnPropertyNames(this.__proto__).forEach((key) => {
      var descriptor = Object.getOwnPropertyDescriptor(this.__proto__, key);
      if (descriptor && (typeof descriptor.get === "function" || typeof descriptor.set === "function")) {
        descriptor.enumerable = true;
        Object.defineProperty(this, key, descriptor);
      }
    });



    this.prop = 1;
  }

  get prop() {
    return this[__PROP];
  }

  set prop(value) {
    this[__PROP] = value;
  }
}

let bar = new Foo();

console.log(bar.prop); // 1
console.log(Object.keys(bar)); // ["prop"]

trikadin 30.09.2015 00:15

devote, лаконичнее, плюсую) Не додумался использовать объект, полученный от Object.getOwnPropertyDescriptor, использовать в Object.defineProperty)

nerv_ 01.10.2015 13:27

Цитата:

Сообщение от FINoM
я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку

Зачем она здесь? В моем примере символ для:
1. приватности
2. скорости набора кода
3. лучшего сжатия кода

Цитата:

Сообщение от trikadin
так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта.

нет другого способа в es6 объявлять геттеры и сеттеры в классах

devote, спасибо.
Цитата:

Сообщение от devote
var self = this;

не надо (на первый взгляд), т.к. arrow function

Я для наглядности для себя сделал так
'use strict';


const __PROP = Symbol();


class Foo {
  constructor() {
    this.__setEnumerable('prop', true);
    this.prop = 1;
  }
  get prop() {
    return this[__PROP];
  }
  set prop(value) {
    this[__PROP] = value;
  }
  __setEnumerable(prop, state) {
    let prototype = this.constructor.prototype;
    let descriptor = Object.getOwnPropertyDescriptor(prototype, prop);
    descriptor.enumerable = state;
    Object.defineProperty(this, prop, descriptor);
  }
}


let bar = new Foo();

console.log(bar.prop); // 1
console.log(Object.keys(bar)); // ["prop"]


Жалко, что так нельзя:
class Foo {
  constructor() {
    this.prop.__enumerable = true;
    this.prop = 1;
  }
}

FINoM 01.10.2015 13:32

Цитата:

Сообщение от nerv_
1. приватности
2. скорости набора кода
3. лучшего сжатия кода

Я ничего не навязываю, просто не совсем тебя понимаю.

1. В матрешке вся информация о "специальных" свойствах хранится в свойстве-объекте Symbol(matreshka).
2. Эм, тут вообще не понял. Твой синтаксис с символами выглядит жирно.
3. А сжатие тут причем? Или ты имеешь в виду, что не хочешь тащить зависимость? Тогда ОК.

nerv_ 01.10.2015 13:42

Цитата:

Сообщение от FINoM
просто не совсем тебя понимаю

вот и я не понимаю, поэтому спрашиваю, что она может дать в данной ситуации

одностороннее связывание
Цитата:

Сообщение от FINoM (Сообщение 390218)
class Foo {
  constructor() {
    magic.on(this, 'change:prop', evt => localStorage.prop = this.prop);
  }
}

двухстороннее
Цитата:

Сообщение от nerv_ (Сообщение 390211)
store.prop // читает из localStorage
store.prop = 1 // пишет в localStorage

или я чего-то не понимаю

FINoM 01.10.2015 13:46

nerv_, эм, а как ты акцессор на localStorage можешь навесить?

FINoM 01.10.2015 13:51

nerv_, теперь въехал. Туплю немного.

devote 01.10.2015 14:04

Цитата:

Сообщение от nerv_
не надо (на первый взгляд), т.к. arrow function

да, согласен.. по привычке уже машинально так делаю)

zig 04.10.2015 00:00

Цитата:

Сообщение от nerv_ (Сообщение 390211)
Цитата:

Сообщение от FINoM (Сообщение 390204)
А в каких задачах ты юзаешь акцессоры

много где :) Например, при работе с localStorage.

Допустим:
store.prop // читает из localStorage
store.prop = 1 // пишет в localStorage

э.. у меня оно точно так же работает из коробки, без всяких плясок с геттерами и сеттерами. это нормально? :blink:

trikadin 04.10.2015 00:29

zig, так тут прикол в том, что он не из LS читать хочет, а из свойства класса (которое читает/пишет в LS)

sortarray 04.10.2015 00:30

Цитата:

Сообщение от zig
э.. у меня оно точно так же работает из коробки, без всяких плясок с геттерами и сеттерами. это нормально?

Это имеет смысл, когда ты хочешь переопределить дефолтное поведение. Например:
objectWithStringInside = {string_: ""}

Object.defineProperty(objectWithStringInside, "string", {
  get: function(){return this.string_},
  set: function(value){if(typeof value === "string") this.string_ = value}
})

objectWithStringInside.string = "foo"
alert(objectWithStringInside.string)
objectWithStringInside.string = 1
alert(objectWithStringInside.string)
objectWithStringInside.string = "bar"
alert(objectWithStringInside.string)

nerv_ 19.10.2015 16:08

Хочу унаследоваться от ymaps.GeoObject.
Проблема - GeoObject подгружается/создается асинхронно.

Пишу
const {ymaps} = window;

// разумеется, ошибка GeoObject is undefined
class GeoObject extends ymaps.GeoObject {
}


Не соображу, как решить :)

---

Так работает
ymaps.ready(() => {
    class GeoObject extends ymaps.GeoObject {
        /**
         * @param {Object} [feature]
         * @param {Object} [options]
         * @see [url]https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject-docpage/[/url]
         */
        constructor(feature, options) {
            super(feature, options);
        }
    };

    console.log('GeoObject', GeoObject);
});


но экспорт из модуля сделать не могу :(

Как быть?

trikadin 19.10.2015 18:58

nerv_, почему не можешь-то?

ymaps.ready(() => {
    export class GeoObject extends ymaps.GeoObject {
        /**
         * @param {Object} [feature]
         * @param {Object} [options]
         * @see [url]https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject-docpage/[/url]
         */
        constructor(feature, options) {
            super(feature, options);
        }
    };
 
    console.log('GeoObject', GeoObject);
});

FINoM 19.10.2015 19:01

trikadin, эм. Можешь пояснить? Что происходит при импорте этого модуля? Скрипт "ждет" пока коллбек не сработает?

nerv_ 20.10.2015 09:56

Цитата:

Сообщение от trikadin
почему не можешь-то?

конечно же я так пробовал :) Если так делать, то ошибка
Цитата:

'import' and 'export' may only appear at the top level
---

Цитата:

Сообщение от FINoM
Можешь пояснить? Что происходит при импорте этого модуля? Скрипт "ждет" пока коллбек не сработает?

именно это и хочу. К сожалению, пока ничего не получилось.
В веб-паке есть лоадеры:
Цитата:

bundle: Wraps request in a require.ensure block (callback)
promise: Wraps request in a require.ensure block (promise)
async-module: Same as bundle, but provides a way to handle script loading errors. Wraps request in a require.ensure block (callback, errback)
http://webpack.github.io/docs/list-o...html#packaging

но, пока ничего не получилось.

FINoM 20.10.2015 10:05

nerv_, а почему бы не инициализировать приложение после срабатывания коллбека? Это не то, что ты хочешь, но проблему с импортами решит.

nerv_ 20.10.2015 10:24

Цитата:

Сообщение от FINoM
а почему бы не инициализировать приложение после срабатывания коллбека? Это не то, что ты хочешь, но проблему с импортами решит

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

trikadin 20.10.2015 14:21

nerv_, затупил, да. Тогда так:

export let GeoObject;

ymaps.ready(() => {
    GeoObject = class GeoObject extends ymaps.GeoObject {
        /**
         * @param {Object} [feature]
         * @param {Object} [options]
         * @see [url]https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject-docpage/[/url]
         */
        constructor(feature, options) {
            super(feature, options);
        }
    };
  
    console.log('GeoObject', GeoObject);
});


Немного многословнее, но это не костыль, а норм практика.

trikadin 20.10.2015 14:23

Цитата:

Сообщение от nerv_
я думал об этом. Однозначно решит. Просто это будет костылем. Я могу его поставить один раз, но делать это постоянно не имею желания

Да ладно, нормально это. У меня на сервере, скажем, сначала инициализируется DB (классы моделей), потом -- контроллеры (тоже классы).

nerv_ 20.10.2015 14:29

допустим. А если я захочу унаследовать от GeoObject что-либо еще? :)
т.е. буду импортить GeoObject в другой модуль? Я получу undefined?

Вопрос сводится к асинхронному es6 импорту/экспорту

trikadin 20.10.2015 14:57

nerv_, почитай мою статью :lol:

Если ты в другом модуле сделаешь
import { GeoObject } from './GeoObject';


то у тебя создастся биндинг на [[ExportsObject]].GeoObject. И в момент, когда значением переменной GeoObject станет класс GeoObject, то и значением [[ExportsObject]].GeoObject станет класс GeoObject. Но в прикладном смысле -- да, ему точно так же придётся ждать, пока у GeoObject появится значение (т. е. ждать инициализации ymaps). Я бы на твоём месте подождал бы этого на глобальном уровне (на уровне точки входа в приложение), а уже потом начинал бы импортить модули, которым нужен ymaps.

Цитата:

Сообщение от nerv_
Вопрос сводится к асинхронному es6 импорту/экспорту

Ты можешь использовать System.loader, но это пока жуткий драфт :С

Safort 04.11.2015 19:10

Кароче, посоны, Object.observe выпиливают https://mail.mozilla.org/pipermail/e...er/044684.html

FINoM 04.11.2015 19:15

Цитата:

Сообщение от Safort
Кароче, посоны, Object.observe выпиливают https://mail.mozilla.org/pipermail/e...er/044684.html

Сам я не большой поклонник О.о, но не понимаю, чем он им так не угодил. Они выпилили фичу, но не дали никакой альтернативы. Теперь нет ни одной нативной функции, которая слушает изменения всех свойств объекта. Прокси не считается.

devote 04.11.2015 19:19

Цитата:

the feature is used on 0.0169% of Chrome pageviews, according to
chromestatus.com
Такие интересные, а они что ожидали что эту возможность будут сейчас юзать на 100% что ли? Оно и понятно, ведь как можно юзать то, что есть только в хроме.


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