29
Advanced Presented by Humayun Kayesh

Advanced JavaScript

Embed Size (px)

Citation preview

Page 1: Advanced JavaScript

Advanced

Presented by

Humayun Kayesh

Page 2: Advanced JavaScript
Page 3: Advanced JavaScript

● ‘this’

● Closure

● Prototype

● Module pattern

Agenda

Page 4: Advanced JavaScript

‘this’

Page 5: Advanced JavaScript

‘this’

● A variable with the value of the object that

invokes the function where this is used.

● Refers to an object; that is, the subject in

context

● Not assigned a value until an object invokes the

function where this is defined

Page 6: Advanced JavaScript

How is the Value of ‘this’ Determined?

The value of ‘this’, is based on the context in which the

function is called at runtime.

Confused?!! Let’s see an example...

Page 7: Advanced JavaScript

var foo = 'foo';

var myObject = {

foo: 'I am myObject.foo'

};

var sayFoo = function() {

console.log(this.foo);

};

// give myObject a sayFoo property and have it point to sayFoo function

myObject.sayFoo = sayFoo;

myObject.sayFoo(); // logs 'I am myObject.foo'

sayFoo(); // logs 'foo'

How is the Value of ‘this’ Determined?

Page 8: Advanced JavaScript

‘this’ Inside Nested Functions

Q: What happens to ‘this’ when it is used inside of a

function that is contained inside of another function?

Ans: ‘this’ loses its way and refers to the head object

(window object in browsers), instead of the object within

which the function is defined.

Solution Hint: Using scope to keep track of function context

Page 9: Advanced JavaScript

var myObject = {

myProperty:'I can see the light',

myMethod:function() {

console.log(this.myProperty); //logs 'I can see the light'

var helperFunction = function() {

console.log(this.myProperty); //logs 'Undefined'

}();

}

}

myObject.myMethod(); // invoke myMethod

‘this’ Inside Nested Functions

Page 10: Advanced JavaScript

Closure

Page 11: Advanced JavaScript

Closure

● A Closure is the local variables for a function - kept alive

after the function has returned

● A function having access to the parent scope, even

after the parent function has closed.

● The closure has three scope chains:o has access to its own scope

o has access to the outer function’s variables and

o has access to the global variables

Page 12: Advanced JavaScript

Example

Page 13: Advanced JavaScript

Example

Page 14: Advanced JavaScript

Practical example

Page 15: Advanced JavaScript

Prototype

Page 16: Advanced JavaScript

Prototype

● A prototype is a collection of properties and

methods that can be automatically attached to

an object when it is created

● Every JavaScript function has a prototype

property

● Used primarily for inheritance

Page 17: Advanced JavaScript

Prototype Code ExamplePictureProtoType = {

getSize: function(){ return this.height * this.width; },

fetchThumbnail:function(){ /*...*/ }

};

function Picture(name, height, width){

this.name = name;

this.height = height;

this.width = width;

}

Picture.prototype = PictureProtoType;

var picture = new Picture('MyPhoto.jpg', 600, 750);

picture.getSize();

Page 18: Advanced JavaScript

Prototype Lookups are Dynamic

● You can add properties to the prototype of an

object at any time

● The prototype chain lookup will find the new

property as expected

See example...

Page 19: Advanced JavaScript

Prototype Lookups are Dynamic PictureProtoType = {

getSize: function(){

return this.height * this.width;

},

fetchThumbnail:function(){ /*...*/ }

};

function Picture(name, height, width){

this.name = name;

this.height = height;

this.width = width;

}

Picture.prototype = PictureProtoType;

var picture = new Picture('MyPhoto.jpg', 600,

750);

picture.getSize();

PictureProtoType.getBlackAndWhite = function()

{

/* code... */

}

picture.getBlackAndWhite();

Page 20: Advanced JavaScript

Extending Native Objects

var keywords = [

"landscape", "tranquil", "green", "vegetation"

] ;

console.log(keywords);

Array.prototype.clear=function(){ this.length=0; }

keywords.clear();

console.log(keywords);

Page 21: Advanced JavaScript

JavaScript Module Pattern

Page 22: Advanced JavaScript

Creating a module

(function () {

// code...

})();

It declares a function, which then calls itself

immediately.

Page 23: Advanced JavaScript

Basic Module

var Module = (function () {

var privateMethod = function () {

// do something

};

})();

Page 24: Advanced JavaScript

Public Method

var Module = (function () {

return {

publicMethod: function () {

// code

}

};

})();

Module.publicMethod();

Page 25: Advanced JavaScript

Anonymous Object Literal Return

var Module = (function () {

var privateMethod = function () {};

return {

publicMethodOne: function () { // I can call `privateMethod()` you know... },

publicMethodtwo: function () { //Code… },

publicMethodThree: function () { // Code… }

};

})();

Page 26: Advanced JavaScript

Revealing Module Pattern

var Module = (function () {

var privateMethod = function () {

// private

};

var someMethod = function () {

// public

};

var anotherMethod = function () {

// public

};

return {

someMethod: someMethod,

anotherMethod: anotherMethod

};

})();

Page 27: Advanced JavaScript

Extending A Module

var Module = (function () {

var privateMethod = function () {

// private

};

var someMethod = function () {

// public

};

var anotherMethod = function () {

// public

};

return {

someMethod: someMethod,

anotherMethod: anotherMethod

};

})();

var ModuleTwo = (function (Module) {

Module.extension = function () {

// another method!

};

return Module;

})(Module || {});

Page 28: Advanced JavaScript

Advantages

● Cleaner approach for developers

● Supports private data

● Less clutter in the global namespace

● Localization of functions and variables through

closures

Page 29: Advanced JavaScript

Q&A…