object-oriented javascript

60
Object- oriented Javascript Daniel Ku (http://kjunine.net/)

Upload: daniel-ku

Post on 27-Jun-2015

258 views

Category:

Technology


4 download

DESCRIPTION

사내 기술 세미나를 다시 시작한다. 나는 그 첫번째 주제로 `Object-oriented Javascript`를 택했다. 예전에 학습했던 [Tuts+ 강의](https://code.tutsplus.com/courses/object-oriented-javascript)를 다시 정리하는 계기가 되었다.

TRANSCRIPT

Page 1: Object-oriented Javascript

Object-oriented JavascriptDaniel Ku (http://kjunine.net/)

Page 2: Object-oriented Javascript

Primitives and Objects

Page 3: Object-oriented Javascript

“Is Everythingin JavaScriptan object?”

Page 4: Object-oriented Javascript

WRONG!

Page 5: Object-oriented Javascript

Primitives» string

» number

» boolean

» undefined

» null

Everything else is object.

Page 6: Object-oriented Javascript

“WHAT?Strings haveproperties and methods!”

Page 7: Object-oriented Javascript

var p = 'hello';p.test = 'test';console.log(p.test); // ?

var o = new String('hello');o.test = 'test';console.log(o.test); // ?

Page 8: Object-oriented Javascript

var p = 'hello';p.test = 'test';console.log(p.test); // undefined

var o = new String('hello');o.test = 'test';console.log(o.test); // test

Page 9: Object-oriented Javascript

typeof 'hello'; // stringtypeof new String('hello'); // objecttypeof 10 // numbertypeof new Number(10); // objecttypeof false; // booleantypeof new Boolean(true); // objecttypeof undefined; // undefinedtypeof null; // object ???

Page 10: Object-oriented Javascript

HOWto create an object?

Page 11: Object-oriented Javascript

Factory Functions

Page 12: Object-oriented Javascript

var createPerson = function(firstName, lastName) { return { firstName: firstName, lastName: lastName, sayHi: function() { return 'Hi there'; } };};

var john = createPerson('John', 'Doe');var jane = createPerson('Jane', 'Doe');

Page 13: Object-oriented Javascript

IT WORKS! BUT,

BAD PRACTICE!

Page 14: Object-oriented Javascript

The this keyword

Page 15: Object-oriented Javascript

thisis

» window in global context

» the object in an object

Page 16: Object-oriented Javascript

var name = 'Jane';

var greet = function() { return 'My name is ' + this.name;}

var person = { name: 'John', greet: greet};

greet(); // ?person.greet(); // ?

Page 17: Object-oriented Javascript

var name = 'Jane';

var greet = function() { return 'My name is ' + this.name;}

var person = { name: 'John', greet: greet};

greet(); // My name is Janeperson.greet(); // My name is John

Page 18: Object-oriented Javascript

var requestAsync = function(url, callback) { var data = 10; callback(data);};

var requestor = { value: 20, process: function(data) { var sum = this.value + data; console.log(sum); }, request: function() { var url = 'http://example.com'; requestAsync(url, this.process); }};

requestor.request(); // ?

Page 19: Object-oriented Javascript

var requestAsync = function(url, callback) { var data = 10; callback(data);};

var requestor = { value: 20, process: function(data) { var sum = this.value + data; console.log(sum); }, request: function() { var url = 'http://example.com'; requestAsync(url, this.process); }};

requestor.request(); // NaN

Page 21: Object-oriented Javascript

var requestAsync = function(url, callback) { var data = 10; callback(data);};

var requestor = { value: 20, process: function(data) { var sum = this.value + data; console.log(sum); }, request: function() { var url = 'http://example.com'; requestAsync(url, this.process.bind(this)); }};

requestor.request(); // 30

Page 22: Object-oriented Javascript

Constructor Functions

Page 23: Object-oriented Javascript

var Person = function(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; this.sayHi = function() { return 'Hi~'; };};

var person = new Person('John', 'Doe');

Page 24: Object-oriented Javascript

Also,

BAD PRACTICE!Do like next.

Page 25: Object-oriented Javascript

var Person = function(firstName, lastName) { this.firstName = firstName; this.lastName = lastName;};

Person.prototype.sayHi = function() { return 'Hi~';};

var person = new Person('John', 'Doe');

Page 26: Object-oriented Javascript

The Prototype

Page 27: Object-oriented Javascript
Page 28: Object-oriented Javascript
Page 30: Object-oriented Javascript

person.constructor === Person; // trueperson.__proto__ === Person.prototype; // trueObject.getPrototypeOf(person) === Person.prototype; // true

Page 31: Object-oriented Javascript

person.hasOwnProperty('firstName'); // trueperson.hasOwnProperty('lastName'); // trueperson.hasOwnProperty('sayHi'); // falseperson.constructor .prototype .hasOwnProperty('sayHi'); // true

Page 32: Object-oriented Javascript

Properties and Property Descriptors

Page 33: Object-oriented Javascript

var person = {};

Object.defineProperty(person, 'firstName', { // descriptor object (data descriptor) value: 'John', writable: true});

Object.defineProperty(person, 'lastName', { value: 'Doe', writable: false});

person.firstName; // 'John'person.lastName; // 'Doe'

Page 34: Object-oriented Javascript

person.firstName = 'Jane';person.firstName; // 'Jane'

person.lastName = 'Dummy';person.lastName; // 'Doe'

Page 35: Object-oriented Javascript

var person = {};

Object.defineProperties(person, { firstName: { value: 'John', writable: true }, lastName: { value: 'Doe', writable: true }, fullName: { // accessor descriptor get: function() { return this.firstName + ' ' + this.lastName; }, set: function(value) { var splits = value.split(' '); this.firstName = splits[0]; this.lastName = splits[1]; } }});

Page 36: Object-oriented Javascript

person.fullName; // 'John Doe'person.fullName = 'Jane Eyre'person.firstName; // 'Jane'person.lastName; // 'Eyre'person.fullName; // 'Jane Eyre'

Page 37: Object-oriented Javascript

var person = {};

Object.defineProperty(person, 'firstName', { value: 'John', enumerable: true});

Object.defineProperty(person, 'lastName', { value: 'Doe', enumerable: false});

for (var key in person) { console.log(key, '=>' , person[key]);}// 'firstName => John'

Page 38: Object-oriented Javascript

Object.defineProperty» Property Descriptors

» Data Descriptors

» Accessor Descriptors

» reference

» es5-shim

Page 39: Object-oriented Javascript

Common Keys of Descriptors» configurable (default: false)

» enumerable (default: false)

Page 40: Object-oriented Javascript

Keys of Data Descriptors» value (default: undefined)

» writable (default: false)

Page 41: Object-oriented Javascript

Keys of Accessor Descriptors» get (default: undefined)

» set (default: undefined)

Page 42: Object-oriented Javascript

Constructors and the Prototype REVISITED

Page 43: Object-oriented Javascript

var Person = function(firstName, lastName) { Object.defineProperty(this, 'firstName', { value: firstName, writable: true, enumerable: true }); Object.defineProperty(this, 'lastName', { value: lastName, writable: true, enumerable: true });};

Page 44: Object-oriented Javascript

Object.defineProperties(Person.prototype, { sayHi: { value: function() { return 'Hi there'; } }, fullName: { get: function() { return this.firstName + ' ' + this.lastName; }, enumerable: true }});

var person = new Person('John', 'Doe');

Page 45: Object-oriented Javascript

HOWto do inheritance?

Page 46: Object-oriented Javascript

Prototypical Inheritance

Page 48: Object-oriented Javascript

var person = { firstName: 'John', lastName: 'Doe'};

var employee = Object.create(person);

Object.getPrototypeOf(employee) === person; // true

Page 50: Object-oriented Javascript

var Person = function(firstName, lastName) { this.firstName = firstName; this.lastName = lastName;};

Person.prototype.sayHi = function() { return 'Hi~';};

var person = new Person('John', 'Doe');

Object.getOwnPropertyDescriptor(Person.prototype, 'sayHi');// {value: function, writable: true, enumerable: true, configurable: true}

Object.getOwnPropertyDescriptor(person, 'firstName');// {value: "John", writable: true, enumerable: true, configurable: true}

Page 51: Object-oriented Javascript

Let's Do Inheritance

Page 52: Object-oriented Javascript

var Person = function(firstName, lastName) { Object.defineProperties(this, { firstName: { value: firstName, writable: true, enumerable: true }, lastName: { value: lastName, writable: true, enumerable: true } });};

Object.defineProperties(Person.prototype, { sayHi: { value: function() { return 'Hi there'; } }, fullName: { get: function() { return this.firstName + ' ' + this.lastName; }, enumerable: true }});

Page 53: Object-oriented Javascript

var Employee = function(firstName, lastName, position) { Person.call(this, firstName, lastName); Object.defineProperties(this, { position: { value: position, writable: true, enumerable: true } });};

Page 54: Object-oriented Javascript

Employee.prototype = Object.create(Person.prototype, { sayHi: { value: function() { return Person.prototype.sayHi.call(this) + ' and here'; } }, fullName: { get: function() { var descriptor = Object.getOwnPropertyDescriptor(Person.prototype, 'fullName'); return descriptor.get.call(this) + ' ' + this.position; }, enumerable: true }, constructor: { value: Employee }});

Page 55: Object-oriented Javascript

var employee = new Employee('John', 'Doe', 'Manager');

for (var key in employee) { console.log(key, '=>' , employee[key]);}// 'firstName => John'// 'lastName => Doe'// 'position => Manager'// 'fullName => John Doe Manager'

Page 56: Object-oriented Javascript

Prototypical Inheritance

Page 57: Object-oriented Javascript
Page 58: Object-oriented Javascript

Object.getPrototypeOf(employee) === Employee.prototype; // true

employee.__proto__ === Employee.prototype; // trueemployee.__proto__.__proto__ === Person.prototype; // trueemployee.__proto__.__proto__.__proto__ === Object.prototype; // trueemployee.__proto__.__proto__.__proto__.__proto__ === null; // true

Page 60: Object-oriented Javascript

THE END