Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var fs = require('fs');
function tmpl(str){
/* br */
var funcBody = "var _buffer=[],print=function(){_buffer.push.apply(_buffer,arguments);};" +
"_buffer.push('" +
str
.replace(/[\n]/g, '/* br */')
.replace(/\\/g, "\\\\")
.replace(/[\r]/g, "")
.replace(/[\t]/g, " ")
.split("<%").join("\t")
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
.replace(/\t=(.*?)%>/g, "',$1,'")
.split("\t").join("');")
.split("%>").join("_buffer.push('")
.split("\r").join("\\'")
+ "');return _buffer.join('');";
return funcBody;
};
var code = fs.readFileSync('source.txt', {encoding:'UTF-8'});
console.log('load ok');
var fnBody = tmpl(code);
fs.writeFileSync('function.js', fnBody);
console.log('convert ok');
var fn = new Function(fnBody);
console.log('compiled ok');
code = fn();
code = code.replace(/\/\*\sbr\s\*\//g, "\n");
fs.writeFileSync('result.txt', code);
console.log('finish');
И тут возникает проблема — fn(foo.bar.baz.bind(foo.bar)). Мы вынуждены писать foo.bar 2 раза, это явное нарушение принципа DRY.Нарушение, действительно. Но с другой стороны, такое сложное обращение говорит о нарушении «закона Деметры». Проблема сложных биндов существует, но она не так остра, потому что решить её можно введя адекватные абстракции.
такое сложное обращение говорит о нарушении «закона Деметры».
test регулярного выражения как коллбэка. Хотя без Proxy или abstract references это выглядит довольно топорно.Почему вы использовали наименование Function#part вместо partial?
fill.Array, Object, Number, Intl и частично String можно заменить на русскоязычные версии :)."Error: internal error while computing Intl data" (проблема в свойстве currencyDisplay, отличном от значения "symbol"):console.log(new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', currencyDisplay: 'code' }).format(123456.789));
Promise. Обещания должны разрешаться асинхронно, для этого нужно эффективное отложенное исполнение, а это далеко не компактно. В итоге, во всех современных браузерах, кроме IE, native-promise-only использует только… setTimeout, разрешающий обещания через 4мс, а не сразу. Здесь же, в рамках модуля setImmediate, присутствует реализация эффективного отложенного исполнения другими способами, не имеющими ограничения в 4мс.Метод Object.create создает объект из прототипа. Передав null, можно создать объект без прототипа, что сделать на базе ECMAScript 3 невозможно. Приходится использовать лютый трэш на базе iframe.
Object.create = function create(prototype, descriptors) {
if (this === Object || typeof this === 'undefined')
switch (typeof prototype) {
case 'object':
case 'function':
var /** @type * */ result = new create(create.prototype = prototype);
return (typeof descriptors === 'undefined') ? result: Object.defineProperties(result, descriptors);
default:
throw new TypeError('Object prototype may only be an Object or null: ' + prototype);
}
else
/* Если происходит внутренний вызов функции как конструктора - удаляем ссылку на прототип, что бы не
* делать этого в основном коде (что бы его этим не захламлять). */
create.prototype = null;
};
Object.defineProperty(Object, 'create', {enumerable: false});
/** @test */
(function(t){[
['создание объекта', function(){
var p = Object.create({z:0}, {
x: { value: 1, writable: false, enumerable:true, configurable: true},
y: { value: 2, writable: false, enumerable:true, configurable: true}
});
return p.hasOwnProperty('x') && p.x === 1 && p.hasOwnProperty('y') && p.y === 2 &&
!p.hasOwnProperty('z') && ('z' in p) && p.z === 0;}],
['создание объекта без свойств', function(){
var p = Object.create({z:0});
return !p.hasOwnProperty('z') && ('z' in p) && p.z === 0;}],
['создание объекта без прототипа', function(){
return Object.getPrototypeOf(Object.create(null)) === null;}]
].forEach(function(p){console.log('Object.create: тест на '+p[0]+' '+(t(p[1])?'':
'НЕ (!!!) ')+'пройден');});})(function(t){try{return t()}catch(e){return false;}});null в качестве прототипа конструктора. iframe имеет своё собственное окружение, включая стандартные конструкторы. Так что создаём iframe, удаляем из его Object.prototype все свойства и когда нам нужно создать объект (якобы) без прототипа — создаём инстанс Object из iframe. Получаем объект без свойств в прототипе и не являющийся инстансом Object текущего окружения. Всегда можно посмотреть код на GitHub'е :)
Размышления о стандартной библиотеке JavaScript. Core.js