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, время: 18:14. |