- PVSM.RU - https://www.pvsm.ru -
Везде и давно говорят о ES2015, хоть на дворе уже 2017 год, ещё есть люди не знакомые с этим стандартом. ES2015 принёс много нового в мир JavaScript, что-то подхватилось моментально, что-то продолжает оставаться в тени.
Все мы любим использовать модульный подход ES6, стрелочные функции, let и const, promises, классы, от деструктуризации многие пришли в восторг. Реже упоминается о новом типе Symbol, генераторах, Map, Set, WeakMap, WeakSet, и много чего ещё.
На мой взгляд основная причина обильного использования одних нововведений, и крайне редкое использование других — это практическая необходимость. Я не могу вспомнить случая, когда мне бы пригодилось использовать Map вместо обычных массивов или объектов. Генераторы я нахожу полезными и классно что в JS их добавили, но опять же, в моей практике написания Front-End'а, я если и находил им применение, то не чаще чем пару раз. Быть может я просто не изменил
Несмотря на все эти WeakSet, генераторы и Symbol'ы, на мой взгляд наиболее всех в стороне оказались Reflect API и Proxy объекты. Давайте вспомним о них, а вдруг там есть что-то полезное.
Начнём с того что Reflect это не конструктор. Это как понятно из названия набор методов для работы с объектами подобно объекту Math.
Предлагаю освежить память и кратко пройтись по некоторым методам Reflect API:
Здесь всё понятно, метод для вызова функции с указанным контекстом. Принимает функцию, контекст, аргументы в виде массива.
function countAmountScore(audienceScore, juryScore) {
return this.userScore + audienceScore + juryScore;
}
let subZeroRating = Reflect.apply(countAmountScore, {userScore: 15}, [5, 10]); // выведет 30
С помощью этого метода можно вызвать конструктор без использования оператора new. Главной «плюшкой» использования этого метода на мой взгляд является третий, необязательный параметр. Это указание прототипа к обращаемой функции-конструктору.
function checkFullName(name, surname) {
this.name = name;
this.surname = surname;
this.getName = function() {
return `${this.name} ${this.middleName} ${this.surname}`
};
}
function addMiddleName () {}
addMiddleName.prototype.middleName = 'Ильич';
let Lenin = Reflect.construct(checkFullName, ['Владимир', 'Ленин'], addMiddleName);
Lenin.getName(); // выведет "Владимир Ильич Ленин"
Этот метод действует аналогично одноименному методу у Object, с той лишь разницей, что метод Reflect.defineProperty возвращает булевое значение, в зависимости от успеха или неудачи присвоения.
Первым аргументом функции идёт объект к которому идёт присвоение свойства, вторым — имя свойства, третьим — опции или просто значение присваиваемого свойства.
Метод для удаления свойство и других сущностей, работает аналогично delete, с той лишь разницей, что возвращает булевое значение в зависимости от успеха или неудачи удаления.
Этот метод не рекомендуется использовать, т.к. он является «устаревшим» (obsolete), если верить документации, но в некоторых браузерах всё ещё может работать.
Этот метод работает подобно for..in, но вместо того чтобы проходится по объекту — возвращает итерацию, проще говоря — генератор. Но так как многие интерпретаторы этот метод не понимают — рассматривать его нет смысла.
Метод служит для получения свойства объекта, применим к массивам.
// Object
var obj = { x: 1, y: 2 };
Reflect.get(obj, 'x'); // 1
// Array
Reflect.get(['zero', 'one'], 1); // "one"
// Proxy with a get handler
var x = {p: 1};
var obj = new Proxy(x, {
get(t, k, r) { return k + 'bar'; }
});
Reflect.get(obj, 'foo'); // "foobar"
Работает аналогично методу Reflect.get с той лишь, что задаёт указанное значение, а не получает его.
Метод Reflect.set возвращает булевое значение в зависимости от успеха или неудачи присвоения значения.
Нужен для проверки существования свойства в объекте. Возвращает булевое значение.
let building = {
__proto__: {
type: "castle"
},
age: 300
};
console.log(Reflect.has(building, "age")); // выведет true
console.log(Reflect.has(building, "type")); // выведет true
Метод Reflect.ownKeys — возвращает ключи элементов объекта, в виде массива. Наследуемые свойства игнорируются.
let obj = {
name: "Иван Федорович Крузенштерн",
rank: "Адмирал",
__proto__: {
yearOfBirth: 1770
}
}
let objKeys = Reflect.ownKeys(obj);
console.log(objKeys.length); // выведет 2
console.log(objKeys[0]); // выведет name
console.log(objKeys[1]); // выведет rank
В статье были приведены не все методы из Reflect.API, остальные показались мне почти целиком аналогичными одноименным методам собрата Object.
Положительный герой или отрицательный этот Reflect.API, есть ли в нём что-то полезное — каждый определит сам. Определённо этот программный интерфейс имеет право на жизнь.
Автор: CodeViking
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/242884
Ссылки в тексте:
[1] мышление: http://www.braintools.ru
[2] Источник: https://habrahabr.ru/post/321706/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.