|
Не знал о 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, время: 12:16. |