рдПрдХ рд╢рд╛рдо, рдареАрдХ рдЬреЗрдПрд╕ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ рдХреБрдЫ рдФрд░ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдерд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрдЯрд░реНрдиред рдЕрдЪрд╛рдирдХ, рдореЗрдЬ рдкрд░ рдПрдХ рдЧреЛрдл рдкреБрд╕реНрддрдХ рджрд┐рдЦрд╛рдИ рджреА рдФрд░ рд▓реИрдкрдЯреЙрдк рд╕реНрдХреНрд░реАрди рдкрд░ "рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреИрдЯрд░реНрди" рдирд╛рдордХ рдПрдХ рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╢рд╛рдо рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреИрдЯрд░реНрди - рдбреЗрдХреЛрд░реЗрдЯрд░, рдСрдмреНрдЬрд░реНрд╡рд░, рдлреИрдХреНрдЯрд░реА, рдордзреНрдпрд╕реНрде, рдореЗрдореЛрдЗрдЬрд╝реЗрд╢рди (рдХрд╛рдлреА рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рддрдХрдиреАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдХрдиреАрдХ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ) рдФрд░ рд╕рд┐рдВрдЧреНрд▓рдЯрди рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рд╛ред ред
рдбреЗрдХреЛрд░реЗрдЯрд░
рд▓рд╛рдирдд рдЕрдЪреНрдЫрд╛ рдкреИрдЯрд░реНрди, рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдордХреНрдЦреА рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рд╣реИ:
function Ball( param ) { this._radius = param.radius; this._color = param.color; } Ball.prototype = { constructor: Ball, INCREMENTATION_STEP: 5, draw: function(){console.log("ball drawn with radius:" + this._radius + " and color: " + this._color)}, inc: function(){ this._radius += this.INCREMENTATION_STEP } } new Ball({ radius:100, color:"red"});
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдирдИ рд▓рд╛рд▓ рдЧреЗрдВрдж рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЧреЗрдВрдж рдХреЛ рди рдХреЗрд╡рд▓ рд▓рд╛рд▓, рдмрд▓реНрдХрд┐ рд▓рд╛рд▓ рдзрд╛рд░реАрджрд╛рд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдбреЗрдХреЛрд░реЗрдЯрд░ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдХрд░реНрд╖рдг рдЙрд╕реЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдореВрд▓
рдЧреЗрдВрдж рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдзрд╛рд░реАрджрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХрд┐ рд╡рд╣ рд╡рд╣рд╛рдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:
рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдПрдХреАрдХреГрдд рд╣реИ
function StripedBall( ball ) { this._ball = ball } StripedBall.prototype = { constructor: StripedBall, draw: function() { this._ball.draw(); console.log("and with stripes"); }, inc: function() { return this._ball.inc(); } } function SpeckledBall( ball ) { this._ball = ball } SpeckledBall.prototype = { constructor: SpeckledBall, draw: function() { this._ball.draw(); console.log("and with dots!"); }, inc: function() { return this._ball.inc(); } }
рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдореВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЬрд┐рдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣рдо рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд╕ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдмрдбрд╝реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ 1> 2 рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
var ball1 = new SpeckledBall( new StripedBall( new Ball({ radius:100, color:"red"}))); var ball2 = new StripedBall( new SpeckledBall( new Ball({ radius:100, color:"green"}))); ball1.draw(); ball1.inc(); ball1.draw(); ball2.draw();
рдЧрд╣рд░реА рд╕рд╛рдВрд╕ рд▓реЗрдВ, рдФрд░ рдЬрд╛рдВрдЪреЗрдВ:
ball drawn with radius:100 and color: red and with stripes and with dots! ball drawn with radius:105 and color: red and with stripes and with dots! ball drawn with radius:100 and color: green and with dots! and with stripes
рд╡реНрдпрд░реНрде рдореЗрдВ рдореИрдВ рдЪрд┐рдВрддрд┐рдд рдерд╛ - рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд┐рдзрд┐ рджреЛ - рд╣рд▓реНрдХрд╛
function MakeStripedBall( ball ) { var function_name = "draw"; var prev_func = ball[ function_name ]; ball[ function_name ] = function() { prev_func.apply( this, arguments ) console.log("and with stripes"); }; return ball; } function MakeSpeckledBall( ball ) { var function_name = "draw"; var prev_func = ball[function_name]; ball[function_name] = function () { prev_func.apply(this, arguments) console.log("and with dots!"); }; return ball; }
рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ 1-2 рд╕реЗ рдЕрдзрд┐рдХ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛ред
рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ:
var ball3 = MakeStripedBall( MakeSpeckledBall( new Ball({ radius: 150, color: "blue" }))); var ball4 = MakeSpeckledBall( MakeStripedBall(new Ball({ radius: 150, color: "blue" }))); ball3.draw(); ball3.inc(); ball3.draw(); ball4.draw();
рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
ball drawn with radius:150 and color: blue and with dots! and with stripes ball drawn with radius:155 and color: blue and with dots! and with stripes ball drawn with radius:150 and color: blue and with stripes and with dots!
рд╕рдм рдХреБрдЫ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдлрд╝реИрдХреНрдЯрд░реА
рджрд░рдЕрд╕рд▓, рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реИ, рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЗрддрдиреА рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ - рдЗрд╕ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рдЖрдЦрд┐рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдЗрд╕ рдкрд╣рд▓реЗ рд▓рдХреНрд╖реНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рдПрдХ рджреВрд╕рд░рд╛ рднреА рд╣реИ - рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреБрдЫ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреИрдбреА, рдореИрдореА рдФрд░ рдмрд╛рд▓рдХ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдмрд╕ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ -
familyfactory.createLad (); familyfactory.createDaddy () , рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рд▓рд╛рд▓ рдФрд░ 210 рд╕реЗрдореА рд╣реИрдВред рд╡рд┐рдХрд╛рд╕, рдХрд╛рд░рдЦрд╛рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рддрдп рдХрд░реЗрдЧрд╛ - рд╣рдо рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рджрд░рдЕрд╕рд▓, рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдКрдкрд░ рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВ):
var Shapes = { Circle: function (param) { console.log("new " + param.color + " circle created with radius " + param.radius + "px"); }, Square: function (param) { console.log("new " + param.color + " square created with " + param.side + "px on a side "); }, Triangle: function (param) { console.log("new " + param.color + " triangle created with " + param.side + "px on a side "); } }
рдФрд░ рдЕрдм рдЖрдк рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдЦреБрдж рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
function ShapeFactory(size, color) { this.size = size; this.color = color; } ShapeFactory.prototype = { constructor: ShapeFactory, makeCircle: function () { return new Shapes.Circle({ radius: this.size / 2, color: this.color }); }, makeSquare: function () { return new Shapes.Square({ side: this.size, color: this.color }); }, makeTrinagle: function () { return new Shapes.Triangle({ side: this.size, color: this.color }); } }
рд╣рдо рдПрдХ рдорд╛рдореВрд▓реА рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
var factory = new ShapeFactory(100, "red") factory.makeSquare(); factory.makeSquare(); factory.makeTrinagle(); factory.makeCircle(); factory.makeTrinagle();
рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЛ рджреЗрдЦреЗрдВ:
new red square created with 100px on a side new red square created with 100px on a side new red triangle created with 100px on a side new red circle created with radius 50px new red triangle created with 100px on a side
рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдПрдХрд╛рдХреА рд╡рд╕реНрддреБ
рд╕рд┐рдВрдЧрд▓рдЯрди рдХреНрдпрд╛ рд╣реИ? рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬрдЯрд┐рд▓, рд▓рдВрдмрд╛ рдФрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ - рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реИред рддрджрдо рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛ рдЕрдВрдд рд╣реИред
рдореИрдВ рдЕрдХреНрд╕рд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдзреНрдпрд╛рди рд╕реЗ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдмрд╣реБрдд рдмрд╛рд░ рдирд╣реАрдВред
рдЖрдк рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рддреБрдЪреНрдЫ рд╣реИ
var singleton_A = { log: function( text ){ console.log(text); } }
рдпрд╣ рдПрдХ рд╕рд░рд▓ рджреГрд╢реНрдп рдФрд░ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ - рджрд┐рдЦрд╛рд╡рд╛
рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд╣рдкрд╛рдард┐рдпреЛрдВ рдпрд╛ рдЕрдиреНрдп рдЬреВрдирд┐рдпрд░реНрд╕ рдХреЗ рдкреНрд░рддрд┐ рдХрд┐рддрдиреЗ рд╢рд╛рдВрдд рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпрд╣ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпреЛрдЬрдирд╛рдПрдВ рдмрджрд▓ рдЧрдИ рд╣реИрдВ рдФрд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред
var Singleton_B; (function(){ var instance; var anticlone_proxy; Singleton_B = function(){ if( instance ){ return instance; } instance = { _counter: 0, log: function( text ){ this._counter++; console.log( text + this._counter ); } } anticlone_proxy = { log: function( text ){ return instance.log( text ); } } return anticlone_proxy; }; })();
рдЙрд╕рдХреА рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:
function NonSingleton() { } NonSingleton.prototype = { consturctor: NonSingleton, scream: function(){console.log("Woooohoooooo!")} } var singleton = new Singleton_B(); var nonsingleton = new NonSingleton(); singleton.log("3..2..1... ignition!"); nonsingleton.scream();
рдпрджрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:
3..2..1... ignition! Woooohoooooo!
Memoization
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдЙрдкрдпреЛрдЧреА рддрдХрдиреАрдХ - рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо рдПрдХ рдЫреЛрдЯреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрд╢ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╕рдорд╛рди рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднреА рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдзреАрдореЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:
function calculation(x, y) { var key = x.toString() + "|" + y.toString(); var result = 0; if (!calculation.memento[key]) { for (var i = 0; i < y; ++i) result += x; calculation.memento[key] = result; } return calculation.memento[key]; } calculation.memento = {};
рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХрд┐рддрдирд╛ рд╕рдордп рдЬреАрдд рд╕рдХрддреЗ рд╣реИрдВ:
console.profile(); console.log('result:' + calculation(2, 100000000)); console.profileEnd(); console.profile(); console.log('result:' + calculation(2, 100000000)); console.profileEnd(); console.profile(); console.log('result:' + calculation(2, 10000000)); console.profileEnd();
рдЕрдЧрд░ рдпрд╣ рдХреЛрдб рдЕрдм Fb рдореЗрдВ Firebug рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдБрдХрдбрд╝реЗ рджреЗрдЦреЗрдВрдЧреЗ:
Profile1: 626.739ms result:200000000 0.012ms result:200000000 63.055msresult:20000000
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд▓реЙрдЧ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрдм рд╣рдордиреЗ рдЕрдиреБрд░реЛрдз рджреЛрд╣рд░рд╛рдпрд╛, рддреЛ рд╣рдордиреЗ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рдпрд╛ред
рдордзреНрдпрд╕реНрде
рдордзреНрдпрд╕реНрде рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдиреНрдирдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╣рддреЗ рд╣реИрдВ, 5 рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ, рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рд░ рдХреЛрдИ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдордзреНрдпрд╕реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╕реЛрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдПрдХ рддреИрдпрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдХрдИ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдордзреНрдпрд╕реНрде рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХреЗрдд рдХреЛ рдордзреНрдпрд╕реНрде рд░рд╕реЛрдИрдШрд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ :)
function Daddy() { } Daddy.prototype = { constructor: Daddy, getBeer: function () { if (!kitchen.tryToGetBeer()) { console.log("Daddy: Who the hell drank all my beer?"); return false; } console.log("Daddy: Yeeah! My beer!"); kitchen.oneBeerHasGone(); return true; }, argue_back: function () { console.log("Daddy: it's my last beer, for shure!"); } } function Mammy() { } Mammy.prototype = { constructor: Mammy, argue: function () { console.log("Mammy: You are f*king alconaut!"); kitchen.disputeStarted(); } } function BeerStorage(beer_bottle_count) { this._beer_bottle_count = beer_bottle_count; } BeerStorage.prototype = { constructor: BeerStorage, takeOneBeerAway: function () { if (this._beer_bottle_count == 0) return false; this._beer_bottle_count--; return true; } }
рдФрд░ рдЕрдм рдЦреБрдж рдкрд┐рдХ рд▓реЗрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ:
var kitchen = { daddy: new Daddy(), mammy: new Mammy(), refrigerator: new BeerStorage(3), stash: new BeerStorage(2), tryToGetBeer: function () { if (this.refrigerator.takeOneBeerAway()) return true; if (this.stash.takeOneBeerAway()) return true; return false }, oneBeerHasGone: function (){ this.mammy.argue(); }, disputeStarted: function (){ this.daddy.argue_back(); } }
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4 рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмреАрдЪ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдПрдХ рдЕрдЪреНрдЫреА рд╕рдЬрд╛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдордзреНрдпрд╕реНрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЧрдпрд╛ред
рд╣рдо рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
var round_counter = 0; while (kitchen.daddy.getBeer()) { round_counter++ console.log( round_counter + " round passed"); }
рд╣рдо рдХрдВрд╕реЛрд▓ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
Daddy: Yeeah! My beer! Mammy: You are f*king alconaut! Daddy: it's my last beer, for shure! 1 round passed ... Daddy: Yeeah! My beer! Mammy: You are f*king alconaut! Daddy: it's my last beer, for shure! 5 round passed Daddy: Who the hell drank all my beer?
рдореИрдВрдиреЗ рдЗрд╕ рднрд╛рд╡рдирд╛рддреНрдордХ рдмрд╛рддрдЪреАрдд рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдСрдмреНрдЬрд░реНрд╡рд░
рдХреНрдпрд╛ рдпрд╣ рд╡рд╣реА рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рджрд┐рди рдореЗрдВ рдкрдЪрд╛рд╕ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗ рдмрд┐рдирд╛ - $ (# some_useful_button) .click (blah_blah_blah) - рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди? рдЗрд╕рдореЗрдВ, рдХреНрд▓рд┐рдХ рдПрдХ рдШрдЯрдирд╛ рд╣реИ, рдФрд░ blah_blah_blah рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдСрдмреНрдЬрд░реНрд╡рд░ рд╣реИ рдЬреЛ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред
рдЕрдкрдиреА рдХрдкрдЯреА рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдШрдЯрдирд╛рдУрдВ рдФрд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреА рдЕрдкрдиреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдФрд░ рднреАред
рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдШрдЯрдХ рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рд╣реИ:
Event = function() { this._observers = []; } Event.prototype = { raise: function (data) { for (var i in this._observers) { var item = this._observers[i]; item.observer.call(item.context, data); } }, subscribe: function (observer, context) { var ctx = context || null; this._observers.push({ observer: observer, context: ctx }); }, unsubscribe: function (observer, context ) { for (var i in this._observers) if ( this._observers[i].observer == observer && this._observers[i].context == context ) delete this._observers[i]; } }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдмрд╛рдК рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд╛рд░ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдВрдЧреЗред
рдкрд╣рд▓рд╛ рд╕рд░рд▓ рд╣реИ
var someEvent = new Event(); someEvent.subscribe(function ( data ) { console.log("wohoooooo " + data ) }); var someObject = { _topSecretInfo: 42, observerFunction: function () { console.log("Top Secret:" + this._topSecretInfo) } } someEvent.subscribe(someObject.observerFunction, someObject); someEvent.raise("yeaah!"); someEvent.raise();
рдФрд░ рдХрдВрд╕реЛрд▓ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
wohoooooo yeaah! Top Secret:42 wohoooooo undefined Top Secret:42
рдФрд░ рджреВрд╕рд░рд╛ ... рдпрд╣ рднреА рд╕рд░рд▓, рд▓реЗрдХрд┐рди рд╕реБрдВрджрд░ рд╣реИ

рдЖрдк рдЗрд╕реЗ
рдпрд╣рд╛рдВ рдЫреВ рд╕рдХрддреЗ
рд╣реИрдВрдЖрдЬ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдм рдХреБрдЫ рд╕реЛрдЪрддрд╛ рд╣реВрдВред рдСрдмреНрдЬрд░реНрд╡рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рд╕реНрд░реЛрддреЛрдВ рдХреЛ
рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ , рдФрд░ рдСрдмреНрдЬрд░реНрд╡рд░ рдпрд╣рд╛рдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░
рд╣реИ