[frontend 101] javascript oop

30
JavaScript OOP Maxis Kao @ Yahoo Search Frontend 101

Upload: maxis-kao

Post on 09-Jan-2017

177 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: [Frontend 101] JavaScript OOP

JavaScript OOP

Maxis Kao @ Yahoo Search

Frontend 101

Page 2: [Frontend 101] JavaScript OOP

JavaScript

Page 3: [Frontend 101] JavaScript OOP

JavaScript

Page 4: [Frontend 101] JavaScript OOP

Java

Page 5: [Frontend 101] JavaScript OOP

OOP

Page 6: [Frontend 101] JavaScript OOP

Classical OOP

➔ Object-oriented programming

➔ C++, Java, Python

Page 7: [Frontend 101] JavaScript OOP

➔ Prototype-based programming

➔ Prototypical inheritance

in JavaScript,

Page 8: [Frontend 101] JavaScript OOP

before we start

Page 9: [Frontend 101] JavaScript OOP

Class

// define a new class called Pokemon with an empty constructor

var Pokemon = function () {};

Defines the object's characteristics.

A class is a template definition of an object's properties and methods.

Page 10: [Frontend 101] JavaScript OOP

Object

// create two instances, mew and pikachu

var mew = new Pokemon();

var pikachu = new Pokemon();

An instance of a class.

Page 11: [Frontend 101] JavaScript OOP

Property

An object characteristic, such as name.

// define the name property for the Pokemon class

var Pokemon = function (pokemonName) {

this.name = pokemonName;

};

Page 12: [Frontend 101] JavaScript OOP

Method

An object capability, such as walk. It is a subroutine or function associated with a class.

// define the method bark() for the Pokemon class

Pokemon.prototype.bark = function () {

console.log("Hey, I'm " + this.name);

};

Page 13: [Frontend 101] JavaScript OOP

Question 1.

Please use JavaScript object to describe a Pokemon which includes a property “name” and a method “bark” to shout its name out.

Page 14: [Frontend 101] JavaScript OOP

1. Object function

var Pokemon = function (pokemonName) {

// this refers to Pokemon

this.name = pokemonName;

};

Pokemon.prototype.bark = function () {

// this refers to Pokemon

console.log("Hey, I'm " + this.name);

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

pikachu.name = 'PikaPika';

pikachu.bark();

Page 15: [Frontend 101] JavaScript OOP

1. Object function

var Pokemon = function (pokemonName) {

// this refers to Pokemon

this.name = pokemonName;

};

Pokemon.prototype.bark = function () {

// this refers to Pokemon

console.log("Hey, I'm " + this.name);

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

// "Hey, I'm Pikachu"

pikachu.name = 'PikaPika';

pikachu.bark();

// "Hey, I'm PikaPika"

Page 16: [Frontend 101] JavaScript OOP

2. Object function (without prototype)

var Pokemon = function(pokemonName) {

this.name = pokemonName;

this.bark = function() {

// this refers to Pokemon

console.log("Hey, I'm " + this.name);

};

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

pikachu.name = 'PikaPika';

pikachu.bark();

Page 17: [Frontend 101] JavaScript OOP

2. Object function (without prototype)

var Pokemon = function(pokemonName) {

this.name = pokemonName;

this.bark = function() {

// this refers to Pokemon

console.log("Hey, I'm " + this.name);

};

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

// "Hey, I'm Pikachu"

pikachu.name = 'PikaPika';

pikachu.bark();

// "Hey, I'm PikaPika"

Page 18: [Frontend 101] JavaScript OOP

3. Object Literal

var Pokemon = {

name: "Pikachu",

bark: function() {

console.log("Hey, I'm " + this.name);

}

};

Pokemon.name = 'Pikachu';

Pokemon.bark();

Pokemon.name = 'PikaPika';

Pokemon.bark();

Page 19: [Frontend 101] JavaScript OOP

3. Object Literal

var Pokemon = {

name: "Pikachu",

bark: function() {

console.log("Hey, I'm " + this.name);

}

};

Pokemon.name = 'Pikachu';

Pokemon.bark();

// "Hey, I'm Pikachu"

Pokemon.name = 'PikaPika';

Pokemon.bark();

// "Hey, I'm PikaPika"

Page 20: [Frontend 101] JavaScript OOP

Question 2.

Please make the public property “name” private in Question 1.

var Pokemon = function(pokemonName) {

this.name = pokemonName;

...

}

Page 21: [Frontend 101] JavaScript OOP

1. Object function

var Pokemon = function(pokemonName) {

var name = pokemonName;

this.bark = function () {

console.log("Hey, I'm " + name);

};

// introduce a setter

this.setName = function (newName) {

name = newName;

};

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

pikachu.setName('PikaPika');

pikachu.bark();

Page 22: [Frontend 101] JavaScript OOP

1. Object function

var Pokemon = function(pokemonName) {

var name = pokemonName;

this.bark = function () {

console.log("Hey, I'm " + name);

};

// introduce a setter

this.setName = function (newName) {

name = newName;

};

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

// "Hey, I'm Pikachu"

pikachu.setName('PikaPika');

pikachu.bark();

// "Hey, I'm PikaPika"

Page 23: [Frontend 101] JavaScript OOP

Trying to access the private member...

var Pokemon = function(pokemonName) {

var name = pokemonName;

this.bark = function () {

console.log("Hey, I'm " + name);

};

// introduce a setter

this.setName = function (newName) {

name = newName;

};

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

pikachu.setName('PikaPika');

pikachu.name = 'PikaPika';

pikachu.bark();

Page 24: [Frontend 101] JavaScript OOP

Trying to access the private member...

var Pokemon = function(pokemonName) {

var name = pokemonName;

this.bark = function () {

console.log("Hey, I'm " + name);

};

// introduce a setter

this.setName = function (newName) {

name = newName;

};

};

var pikachu = new Pokemon('Pikachu');

pikachu.bark();

// "Hey, I'm Pikachu"

pikachu.setName('PikaPika');

pikachu.name = 'PikaPika';

pikachu.bark();

// "Hey, I'm Pikachu"

Page 25: [Frontend 101] JavaScript OOP

Pokemon.bark();

Pokemon.setName('Pikachu');

Pokemon.bark();

2. Immediately Invoked Function (IIF)

var Pokemon = (function(){

var name;

var setName = function(newName) {

name = newName;

};

var bark = function () {

console.log("Hey, I'm " + name);

};

return {

bark: bark,

setName: setName

};

})();

Page 26: [Frontend 101] JavaScript OOP

var Pokemon = (function(){

var name;

var setName = function(newName) {

name = newName;

};

var bark = function () {

console.log("Hey, I'm " + name);

};

return {

bark: bark,

setName: setName

};

})();

Pokemon.bark();

// "Hey, I'm undefined"

Pokemon.setName('Pikachu');

Pokemon.bark();

// "Hey, I'm Pikachu"

2. Immediately Invoked Function (IIF)

Page 27: [Frontend 101] JavaScript OOP

function MythPokemon(pokemonName, ability) {

// Call the parent constructor using .call()

Pokemon.call(this, pokemonName);

// Initialize the MythPokomon-specific properties

this.ability = ability;

}

MythPokemon.prototype = Object.create(Pokemon.prototype);

MythPokemon.prototype.bark = function(){

console.log("I'm mighty " + this.name + "! I can " + this.ability);

};

Inheritance

Page 28: [Frontend 101] JavaScript OOP

Inheritance: use MythPokemon

var mew = new MythPokemon('Mew', 'sing a song');

mew.bark();

Page 29: [Frontend 101] JavaScript OOP

Inheritance: use MythPokemon

var mew = new MythPokemon('Mew', 'sing a song');

mew.bark();

// "I'm mighty mew! I can sing a song"

Page 30: [Frontend 101] JavaScript OOP

Happy JavaScript OOP!