Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
моя встроенная сигнализация плохого JavaScript до сих пор срабатывает, когда я вижу прямое обращение и задание свойств экземплярам объекта. За долгое время я был научен багами и техническими требованиями избегать произвольного задания свойств экземплярам класса, так как это непременно приводит к тому, что информация распространяется между ими всеми.
_.extend вы создаете объект, но свойство prop1 копируется в него по ссылке. prop1 из прототипа или использовать deep copyvalueOf и toString везде и всегда.Object.create, Object.keys — IE9+, в старых легко реализуется полноценный полифил.Object.defineProperty, Object.defineProperties, Object.preventExtensions, Object.seal, Object.freeze, Object.getOwnPropertyNames — IE9+, полноценный полифил невозможен.Symbol — Chrome 38 (с 35, если не ошибаюсь — с флажком экспериментальных возможностей), FF33, обещают в IE12. Полноценный полифил невозможен, частичная реализация функционала — вполне.Proxy давно доступен в стабильном FF. В v8, по крайней мере, до недавних пор — с флажком экспериментальных возможностей, но в нём устаревшая версия, чьё api можно подогнать под актуальное. Сейчас не вижу. Полифил на базе ES5 невозможен.Symbol возвращает уникальный ключ, символы не участвуют в обходе через for-in, что должно было сделать данные, расположенные по ключам-символам, полностью приватными. Однако, приватность слегка ослабили, для получения собственных символов объекта добавили метод Object.getOwnPropertySymbols.Symbol уже привычен. Думаю, что и в JS он приживётся.var Person = (function(){
var NAME = Symbol('name');
function Person(name){
this[NAME] = name;
}
Person.prototype.getName = function(){
return this[NAME];
};
return Person;
})();
var person = new Person('Вася');
console.log(person.getName()); // => 'Вася'
console.log(person['name']); // => undefined
console.log(person[Symbol('name')]); // => undefined, каждый вызов Symbol возвращает уникальный ключ
for(var key in person)console.log(key); // => только 'getName', символы не участвуют в обходе объекта
Продвинутое использование объектов в JavaScript