![](https://habrastorage.org/storage/habraeffect/47/38/47382416492a4b5741253c8605b7079c.jpg)
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рджреВрд╕рд░рд╛ рднрд╛рдЧ рдПрдЯрдо рдорд┐рдирд┐рдПрдЪрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ ( рдкреВрд░реНрд╡ рдореЗрдВ рдиреИрдиреЛ ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рдЕрдм рд╕рдм рдХреБрдЫ рдЕрддрд┐рд░реЗрдХ рдХреЛрд░ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рдЬрди - 1 рдХреЗрдмреАред
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ - рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдкреВрд░реА рдЕрд╕реНрд╡реАрдХреГрддрд┐ред
рдбреЛрдо, рдХреНрд▓рд╛рд╕, рдЕрдЬрд╛рдХреНрд╕, рдЖрджрд┐ред - рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдкрддрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ: github.com/theshock/atomjs
рдХрдЯреМрддреА рдХреЗ рддрд╣рдд - рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдирдпрд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдЧреАрдерд╣рдм рдкрд░ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдПрдкрд┐ рд╣реИ
рдХреЛрд░
рдХреЛрд░ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдЪреАрдЬ рдмрдиреА рд╣реБрдИ рд╣реИ - рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ 1.8.5 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред
atom.extend, atom.implement
atom.extend
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рд╕реНрд╡рдпрдВ рдкрд░рдорд╛рдгреБ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
atom.implement
рддрддреНрд╡реЛрдВ рдФрд░ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдпреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбреЛрдо рд▓рд╛ JQuery рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧ-рдЗрди рд╣реИ, MooTools рдореЗрдВ рдПрдХ рдХреЗ рд╕рдорд╛рди рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧ-рдЗрди рдФрд░ рдЕрдЬрд╛рдХреНрд╕ рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рдПрдХ рд╕реЗрдЯ
рдкрд┐рдЫрд▓реЗ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рдж рд╕реЗ рдбреЛрдо рдкреНрд▓рдЧрдЗрди рдмрд╣реБрдд рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЕрдЬрд╛рдХреНрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ
Atom.Plugins.Class
рдХреНрд▓рд╛рд╕ рдкреНрд▓рдЧрдЗрди MooTools рдореЗрдВ рдПрдХ рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛ рд╣реИ
рд╕рд░рд▓ рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
var Animal = atom.Class({ constructor : function (name) { this.name = name; this.log('Animal.constructor'); }, walk : function () { this.log('Animal.walk'); }, // _name : 'default', set name (name) { this._name = name || 'anonymous'; }, get name () { return this._name; } }); var Dog = atom.Class(Animal, { constructor : function (name, breed) { this.parent(name); this.breed = breed; this.log('Dog.constructor'); }, bark : function () { return this.log('Dog.bark'); } });
рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдереИрддрд┐рдХ рдЧреБрдгреЛрдВ рдФрд░ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
var AnimalFactory = atom.Factory({ constructor : function (name, breed) { this.name = name; alert(this.self.staticProperty) } }).extend({ staticProperty : 123 }).mixin(MixClass1, MixClass2); var animal = AnimalFactory.produce(['name', 'breed']);
рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рд╕реЗ рд╡рд░реНрдЧ:
var AnimalFactory = atom.Factory({}); var Animal = AnimalFactory.get(); Animal.factory == AnimalFactory;
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд╛рдорд╛рдиреНрдп рдХрдХреНрд╖рд╛рдПрдВ рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдирд╛, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛
рдЗрд╕рд▓рд┐рдП, рдПрдореНрдмреЗрдбреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдЪрд▓реЛ рдЬреЛрдбрд╝рдХрд░ рдорд╛рдирдХ рдРрд░реЗ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИ, рддреЛ, рд╕реНрдерд▓рд╛рдХреГрддрд┐рдХ, рдорд╛рдирдЪрд┐рддреНрд░, рдФрд░ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░реЗрдВ:
// safe atom.implement(Array, 'safe', { forEach : function (fn) { for (var i = 0, l = this.length; i < l; i++) if (i in this) { fn(this[i], i); } return this; }, map : function (fn) { var arr = []; for (var i = 0, l = this.length; i < l; i++) if (i in this) { arr[i] = fn(this[i], i); } return arr; }, // , get isEmpty () { return !this.length; } }); atom.extend(Array, 'safe', { toArray : function () { return Array.prototype.slice.call(elem); } });
рдПрдХ рдкреВрд░реНрдг рдкрд░рдорд╛рдгреБ рдкреНрд▓рдЧ-рдЗрди рдмрдирд╛рдирд╛
(function () { // . // true atom.plugins['ajax'] = true; // atom.ajax(config) var ajax = function (userConfig) { // - var config = atom.extend({ interval : 0, type : 'plain', method : 'post', url : location.href, onLoad : function(){}, onError : function(){} }, userConfig); // , ? var req = new XMLHttpRequest(); req.onreadystatechange = ajax.onready; req.open(config.method.toUpperCase(), config.url, true); req.send(null); }; // // ajax.onready = function (e) { if (req.readyState == 4) { if (req.status != 200) return config.onError(e); var result = req.responseText; if (config.type.toLowerCase() == 'json') { result = JSON.parse(result); } if (config.interval > 0) setTimeout(function () { atom.ajax(config); }, config.interval * 1000); config.onLoad(result); }; }; // Atom atom.extend({ ajax : ajax }); })();
рдЕрдм, рдпрджрд┐ рдбреЛрдо-рдкреНрд▓рдЧрдЗрди рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЕрдЬрд╛рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред
// Atom atom.extend({ ajax : ajax }); // Dom if (atom.plugins['dom']) { // atom.implement({ ajax : function (config) { config = extend({}, config); // , , , // atom() atom.ajax(extend(config, { // // onLoad : (config.onLoad || function (res) { this.get().innerHTML = res; }).bind(this), onError : (config.onError || function(){}).bind(this) })); return this; } }); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ)
рдкреБрдирд╢реНрдЪ
рдореИрдВ рд╕реБрдЭрд╛рд╡, рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВ, рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реВрдВ) рдореИрдВ рдЦреБрдж рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдирд╣реАрдВ рдЦреАрдВрдЪреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдореБрджрд╛рдп рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред