|
Не знал о require("babel/register"); вопрос не актуален |
Ребят, кто-то в курсе, как импортить/экспортить AMD модули в Babel, без вставки бабелем проверок и "_interopRequireDefault"?
https://github.com/babel/babel/issues/2381 - вот тут пример кода, который я бы хотел получить в итоге. |
Я бы предложил лучше перейти на common.js + webpack.
|
Цитата:
Цитата:
|
FINoM, конечно. Нужно лишь js файлы грузить через babel-loader
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
import X from 'x'; let y = new X(); export default y; >>> define(['x'], function(X) { var y = new X(); return y; });Как включить AMD я знаю. |
Как сделать свойства перебираемыми при описании геттеров/сеттеров 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"] |
nerv_, полагаю, никак. А в каких задачах ты юзаешь акцессоры, если не секрет?
|
Цитата:
Допустим: store.prop // читает из localStorage store.prop = 1 // пишет в localStorage |
nerv_, я просто не могу упустить возможности порекомендовать тебе заюзать Матрешку. Сейчас функции, которые работают с объектами вынесены в небольшую либу, которая находится в папке /magic репки.
class Foo { constructor() { magic.on(this, 'change:prop', evt => localStorage.prop = this.prop); } } И не нужно городить огороды с символами. |
nerv_, так ты тут хочешь сделать enumerable свойство, которое объявлено в прототипе объекта. Если ты хочешь, чтобы оно было доступно именно в объекте, то придётся объявлять его на самом объекте, ничего не попишешь :С
Если у тебя таких свойств много -- сделай ф-цию, которая будет пробегать по obj.__proto__, находить все элементы, для которых Object.getOwnPropertyDescriptor возвращает объект, в котором есть геттер, и ставить их самому объекту. Это, конечно, тоже извращение, но хотя бы инкапсулированное извращение. |
|
'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"] |
devote, лаконичнее, плюсую) Не додумался использовать объект, полученный от Object.getOwnPropertyDescriptor, использовать в Object.defineProperty)
|
Цитата:
1. приватности 2. скорости набора кода 3. лучшего сжатия кода Цитата:
devote, спасибо. Цитата:
Я для наглядности для себя сделал так '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; } } |
Цитата:
1. В матрешке вся информация о "специальных" свойствах хранится в свойстве-объекте Symbol(matreshka). 2. Эм, тут вообще не понял. Твой синтаксис с символами выглядит жирно. 3. А сжатие тут причем? Или ты имеешь в виду, что не хочешь тащить зависимость? Тогда ОК. |
Цитата:
одностороннее связывание Цитата:
Цитата:
|
nerv_, эм, а как ты акцессор на localStorage можешь навесить?
|
nerv_, теперь въехал. Туплю немного.
|
Цитата:
|
Цитата:
|
zig, так тут прикол в том, что он не из LS читать хочет, а из свойства класса (которое читает/пишет в LS)
|
Цитата:
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) |
Хочу унаследоваться от 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); }); но экспорт из модуля сделать не могу :( Как быть? |
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); }); |
trikadin, эм. Можешь пояснить? Что происходит при импорте этого модуля? Скрипт "ждет" пока коллбек не сработает?
|
Цитата:
Цитата:
Цитата:
В веб-паке есть лоадеры: Цитата:
но, пока ничего не получилось. |
nerv_, а почему бы не инициализировать приложение после срабатывания коллбека? Это не то, что ты хочешь, но проблему с импортами решит.
|
Цитата:
|
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); }); Немного многословнее, но это не костыль, а норм практика. |
Цитата:
|
допустим. А если я захочу унаследовать от GeoObject что-либо еще? :)
т.е. буду импортить GeoObject в другой модуль? Я получу undefined? Вопрос сводится к асинхронному es6 импорту/экспорту |
nerv_, почитай мою статью :lol:
Если ты в другом модуле сделаешь import { GeoObject } from './GeoObject'; то у тебя создастся биндинг на [[ExportsObject]].GeoObject. И в момент, когда значением переменной GeoObject станет класс GeoObject, то и значением [[ExportsObject]].GeoObject станет класс GeoObject. Но в прикладном смысле -- да, ему точно так же придётся ждать, пока у GeoObject появится значение (т. е. ждать инициализации ymaps). Я бы на твоём месте подождал бы этого на глобальном уровне (на уровне точки входа в приложение), а уже потом начинал бы импортить модули, которым нужен ymaps. Цитата:
|
Кароче, посоны, Object.observe выпиливают https://mail.mozilla.org/pipermail/e...er/044684.html
|
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 10:49. |