nerv, для написания итераторов удобно использовать генераторы.
function *makeIterator(array){ var nextIndex = 0; while (nextIndex < array.length) { yield array[nextIndex++]; } } var iterator = makeIterator([1,2,3]); for (var key of iterator) { alert(key); } А ещё можно так: for (var key of (el for (el of [1,2,3]))) { alert(key); } |
kobezzza, ага, спасибо, я знаю. Только без regeneratorRuntime в ES5 работать не будет.
Кстати, эта поделка от фейсбука https://github.com/facebook/regenerator |
Цитата:
|
Наткнулся тут на одну фичу, здесь, вроде, еще не было:
let room = new Room(); let character = new Character({room}); assert.equal(character.room, room); room.destroy(); assert.isNull(character.room); assert.isNull(room); //!!! И даже кодить ничего не надо: const revoke = Symbol(); class Model { constructor() { let { proxy, revoke: revokeHandler } = Proxy.revocable(this, {}); this[revoke] = revokeHandler; return proxy; } destroy() { this[revoke](); } } class Character extends Model { constructor(room) { super(); Object.assign(this, { room }); } } class Room extends Model {} https://people.mozilla.org/~jorendor...roxy.revocable |
Изобретаем Deferred по новой :D
class Deferred { constructor(generator) { this.promise = new Promise((resolve, reject) => { Object.assign(this, {resolve, reject}); }); generator.next(); let next = value => { let result = generator.next(value); if (!result.done) { value = result.value; if (value && value.next) { new Deferred(value).done(next).fail(this.reject); } else { next(value); } } }; next(this); } done(onFulfilled) { this.promise.then(onFulfilled); return this; } fail(onRejected) { this.promise.catch(onRejected); return this; } } function * getFoo() { let deferred = yield; setTimeout(function() { deferred.resolve('foo'); }, 100); } function * getBar() { let deferred = yield; let foo = yield getFoo(); setTimeout(function() { deferred.resolve(foo + 'bar'); }, 100); } new Deferred(getBar()).done(function(value) { console.log(value); }); // в консоль выведется "foobar" |
Octane, поясняй пож. я, например, нифига не понял :)
Tagged template strings. Вызываем функции без скобок? alert`1` тот же код, пропущенный через babel: "use strict"; var _taggedTemplateLiteral = function (strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }; alert(_taggedTemplateLiteral(["1"], ["1"])); |
Цитата:
var myStr = ` Hello ${name}! I'm glad to see you. `; Если все оставить как есть, то в нашей строке будут переводы строк и начальные пробелы, а зачастую нам это совсем не нужно. В некоторых языках существуют разные литералы строк, которые могут по разному обрабатывать такие кейзы, но в JS решили сделать самый универсальный способ: позволить пользователю самому определять "тег" для строки, где обрабаывать нужную логику (экранирование, переводы строк и т.д.) var myStr = n2br` Hello ${name}! I'm glad to see you. `; Скобки тут бы очень мешались, поэтому их нет, всё просто :) К сожалению тег может быть только один :( |
К моему удивлению, с babel прокатил такой синтаксис:
class X { 'method'() { } } Баг или фича? |
Цитата:
class X { method() { } '@method'() { } [1 + 2]() { } } |
melky,
Цитата:
Цитата:
|
Цитата:
*** Пример функции экранирования переменных: function html(arr, ...vars) { return arr.reduce((str, el, i) => str += EscapeStr(vars[i - 1]) + el); } var str = html`Hello ${name}`; |
В бетку добавили классы http://blog.chromium.org/2015/03/chr...ations_12.html
З.Ы. в ночноПанде тоже, как я понял, уже их можно использовать) З.Ы.Ы. теперь в ФФ из самого нужного осталось только модули заделать. Я почти счастлив. |
Цитата:
Я просто не с первого раза догнал что за const caller = yield в этой статье: «No promises: asynchronous JavaScript with only generators». Оказалось ничего интересного, просто в next передается. |
Неприятный момент с Symbol
try { var string = [Symbol()].join(); } catch(e) { alert(e.message); } alert(string); приходится делать так var string = [Symbol().toString()].join(); alert(string); upd: Преобразование типов с символами |
Господа, есть ли простой способ поменять функцию, отвечающую за наследование классов в Babel? В Матрёшке используется хак, добавлющий возможность использовать акцессоры в ИЕ8, а клиент требует поддержки восьмого осла в новом проекте.
И другой вопрос: кто-то вообще юзал Babel в восьмом осле? Я в своё врем очень сильно натрахался с полифилами, не хочу столкнуться с этой проблемой снова. Знаю, что Бабель по идее подерживает ИЕ8 с некоторыми ограничениями, но насколько хорошо он поддерживается на практике? В частности, интересуют for..of (Symbol) и классы. |
Цитата:
для поддержки Symbol надо подключить полифил browser-polyfill.js for..of транслируется в es5 + требует полифил (насколько понимаю) Если рассматривать в общих чертах, то: - если эмулируется новые объекты/методы прототипов, они полифилятся - если синтаксис - транслируются |
nerv_, понял. В крайнем, могу отказаться от полифилов. Оcтаётся вопрос с переопределением _inherit.
|
Цитата:
Хорошо, что теперь нет. |
nerv_, не совсем понимаю, о чем ты. У тебя получилось переопределить _inherit?
|
https://github.com/babel/babel/issues/1028 - ребята говорят, что скоро можно будет указывать во что будет трансформироваться тот или иной код, в том числе и классы.
|
Цитата:
Цитата:
ChildClass.__proto__ = SuperClass; SuperClass.staticProperty = 1; ChildClass.staticProperty → 1 |
Цитата:
Bar.inherit(Foo); Цитата:
т.е. мне ничего не надо переопределять, я просто выкинул es5 код вернее, перевел его на es6 static почти не использую кроме того поддержка ниже ie10 не интересует |
Предложение по декораторам https://github.com/wycats/javascript-decorators
|
Не помню, было тут или нет, но на всякий случай выложу: https://github.com/tc39/ecma262/blob/master/README.md (идеи для ES7)
|
Цитата:
@abstract class Model { constructor(data) { Object.assign(this, data); } } console.log(new Model()); //TypeError: Cannot directly instantiate an abstract class function abstract(target) { return new Proxy(target, { construct() { throw new TypeError("Cannot directly instantiate an abstract class"); } }) } |
Что-то я туплю с генераторами, может кто-нибудь объяснит как надо?
Дано: koa.js, нативный драйвер mongodb и неосиляторство генераторов. Вопрос: как вывести данные на страницу(да-да, вот так всё у меня запущено)? Код(для облегчения примера, заменил запрос к БД на обычный таймер): app.get('/query', function*() { let _this = this; setTimeout(function() { _this.body = 'ответ'; }, 100); }); В консоль выдаёт Цитата:
|
таймаут в генераторе на заменяет ожидание подключения к бд, у тебя должен быть yield, что-то типа такого:
app.get('/query', function*() { this.body = yield getBody(); }); |
Octane,
так тоже пробовал. В консоли ошибок нет, но на странице выдает: Цитата:
|
Блин, тоже надо Koa курить :)
|
Абстрактные ссылки из ES7 были заменены на 2 новых стандарта:
https://github.com/zenparsing/es-function-bind https://github.com/zenparsing/es-private-fields Поддержку из Babel пока убрали, хнык :( |
Цитата:
Моя стратегия с итератором пока верна))) |
Цитата:
Особенно порадовал пример: $(".some-link").on("click", ::view.reset); Т.е. тут this будет ссылаться на view, а не на ноду, т.е. если переписать на ES5, то будет так $(".some-link").on("click", view.reset.bind(view)); |
Кстати, мы как то пропустили новый синтаксис классов.
class Foo { // Публичное свойство a = 1; // Приватное свойство @b = 2; // Хз, можно ли так объявлять приватные методы, но вообще логично @foo() { // Обращение к приватному свойству this.@b = 3; } } Пока не понятно, будут ли такие свойства приватными (т.е. доступными только внутри класса) или протектед (т.е. доступные внутри класса и дочерних классов). |
Цитата:
|
Цитата:
Цитата:
Наоборот, this будет прибиндин к view $(".some-link").on("click", ::view.reset); -> $(".some-link").on("click", view.reset.bind(view)); |
Цитата:
Если не затруднит, на будущее, помимо выкладывания кода сюда, пожалуйста, давай еще ссылку на песочницу. А то твой текущий пример в ней не работает) |
Цитата:
|
|
Цитата:
let m = new Map() m.set("hello", 42) m.set(s, 34) // что такое s?! m.get(s) === 34 m.size === 2 for (let [ key, val ] of m.entries()) console.log(key + " = " + val) var m = {}; m["hello"] = 42; // no equivalent in ES5 // да есть эквивалент (реализуется через массив) // no equivalent in ES5 // и тут есть Object.keys(m).length === 2; for (key in m) { if (m.hasOwnProperty(key)) { var val = m[key]; console.log(key + " = " + val); } } В качестве эквивалентов логичнее было ссылки на полифилы давать (для таких случаев). |
nerv_,
Цитата:
|
Часовой пояс GMT +3, время: 00:25. |