SlideShare uma empresa Scribd logo
1 de 16
{ for AngularJS, React}
고급 자바스크립트
2. prototype of class
탑크리에듀
IT기술 칼럼
와 함께하는
{ ES6 }2. prototype of class
먼저, ES5문법에서 사용하던 방식을 살펴보겠습니다.
Car 함수를 선언합니다. 그 후에, 함수가 갖고 있는 히든 프로퍼티 prototype이
가리키는 객체에 동적으로 say라는 프로퍼티를 추가하고 이 것이 함수를 가리키게 합니다.
이렇게 하면 함수를 생성자로 사용하여 만들어지는 객체는 say함수를 이용할 수 있습니다.
바로, 자바스크립트의 프로토타입 체이닝을 통해 부모로부터 상속받는 자원을
이용하는 모습입니다.
example2.js
function Car(){}
Car.prototype.say =function() {
console.log('Hi');
}
let car =new Car('A');
console.log(car); // {}
car.say(); // Hi
{ ES6 }2. prototype of class
그런데, 함수를 선언한 다음에 상속 자원(변수, 함수)을 설정하는 모습이 낯설기도 하고
깜박 잊고 설정하지 않을 수도 있겠지요.
이를 클래스 문법으로 변경하면 함수의 프로토타입 객체에 추가되는 자원도
클래스 범위 안에서 설정합니다.
이렇게 하면, 범위 구분이 확실해서 좋고 기존 자바 개발자들도 클래스를 작성하는 방법이
친숙하게 느껴져서 쉽게 작성할 수 있을 것 입니다.
다음 예제를 살펴보면서 얘기를 나눠보겠습니다.
class2.es6
class Car{
say() {
console.log('Hi');
}
}
let car =new Car();
console.log(car); // {}
car.say(); // Hi
{ ES6 }2. prototype of class
example2.js와 class2.es6의 코드는 결과적으로 같은 로직을 수행하는 코드입니다.
클래스 문법에서는 클래스의 프로토타입 객체에 추가하는 자원을 클래스 범위 내에서 일반적
인 함수처럼 선언합니다.
클래스 문법에서는 프로토타입 객체에 변수를 추가하는 방법은 지원하지 않습니다.
이를 수행하고자 원한다면 Car.prototype 객체에 직접 추가하는 방법을 사용해서 구현할 수 있
습니다. 클래스는 함수이므로 다음처럼 작성하면 됩니다.
class2.es6
class Car{
say() {
console.log('Hi');
}
}
let car =new Car();
console.log(car); // {}
car.say(); // Hi
console.log(car.number); // undefined
Car.prototype.number = 7;
console.log(car.number); // 7
{ ES6 }2. prototype of class
다음으로 example2.es6 파일을 트랜스파일링한 결과코드를 살펴보겠습니다.
class2.js
'usestrict';
var_createClass= function(){
functiondefineProperties(target,props){
for(vari= 0;i <props.length;i++){
vardescriptor=props[i];
descriptor.enumerable=descriptor.enumerable|| false;
descriptor.configurable= true;
if("value"in descriptor)
descriptor.writable= true;
Object.defineProperty(target,descriptor.key,descriptor);
}
}
returnfunction(Constructor,protoProps,staticProps){
if(protoProps)
defineProperties(Constructor.prototype,protoProps);
if(staticProps)
defineProperties(Constructor,staticProps);
returnConstructor;
{ ES6 }2. prototype of class
};
}();
function_classCallCheck(instance,Constructor){
if(!(instanceinstanceofConstructor)){
thrownewTypeError("Cannotcalla classasafunction");
}
}
varCar=function(){
functionCar(){
_classCallCheck(this,Car);
}
_createClass(Car,[
{
key:'say',
value:functionsay(){
console.log('Hi');
}
}
]);
returnCar;
}();
{ ES6 }2. prototype of class
varcar= newCar();
console.log(car);//{}
car.say();//Hi
console.log(car.number);
Car.prototype.number=7;
console.log(car.number);
//#sourceMappingURL=C:Lessonecmascript20170328what-is-classclass2class2.js.map
코드를 부분적으로 살펴보는 것이 좋겠습니다. : )
var Car = function() {
function Car() {
_classCallCheck(this, Car); // 생성자로 사용되고 있는지 체크한다.
}
_createClass(Car, [
{
key: 'say',
value: function say() {
console.log('Hi');
{ ES6 }2. prototype of class
}
}
]);
returnCar;
}();
함수를 선언하면서 즉시 실행하고 있으므로 “var Car”가 할당받는 결과는 “return Car;” 코드에
따라서 지역함수인 Car입니다. 이 때 지역함수 Car는 필요한 작업이 수행된 함수입니다.
어떤 작업을 수행한 후에, 지역함수 Car를 리턴하는지 살펴보겠습니다.
_createClass(Car,[
{
key:'say',
value:functionsay(){
console.log('Hi');
}
}
]);
_createClass 함수의 파라미터로 다음 데이터를 전달하고 있습니다.
{ ES6 }2. prototype of class
var_createClass= function(){
functiondefineProperties(target,props){
for(vari= 0;i <props.length;i++){
vardescriptor=props[i];
descriptor.enumerable=descriptor.enumerable|| false;
descriptor.configurable= true;
if("value"in descriptor)
descriptor.writable= true;
Object.defineProperty(target,descriptor.key,descriptor);
}
}
returnfunction(Constructor,protoProps,staticProps){
if(protoProps)
defineProperties(Constructor.prototype,protoProps);
if(staticProps)
defineProperties(Constructor,staticProps);
returnConstructor;
};
}();
_createClass가 가리키는 함수는 어떤 상태인지 살펴봅니다.
{ ES6 }2. prototype of class
returnfunction(Constructor,protoProps,staticProps){
if(protoProps)
defineProperties(Constructor.prototype,protoProps);
if(staticProps)
defineProperties(Constructor,staticProps);
returnConstructor;
};
함수를 선언한 후 즉시실행하고 있으므로 _createClass가 가리키는 함수는 다음과 같습니다.
_createClass(생성자함수,프로토타입객체에추가될자원,생성자함수객체에직접추가될정적인자원)
이 때, 전달되는 파라미터의 존재여부에 따라서 기동하는 함수 defineProperties 함수는
외부 스코프에 있으므로 클로져가 됩니다. 위 코드를 정리하면 다음과 같습니다.
if(protoProps)
defineProperties(Constructor.prototype,protoProps);
현재, 프로토타입객체에 추가될 자원만 존재하므로, 다음 조건만이 만족됩니다.
{ ES6 }2. prototype of class
첫번째파라미터:Car.prototype,
두번째파라미터:
[
{
key:'say',
value:functionsay(){
console.log('Hi');
}
}
]
Object.defineProperty 메소드는 target객체에 새 프로퍼티를 정의하거나 기존 프로퍼티를 수
정하는 메소드입니다.
결과로 수정된 객체를 리턴하는데 여기서는 리턴 값을 사용하고 있지는 않고 있습니다.
Constructor.prototype, protoProps으로 전달되는 파라미터의 실체를 환원해서 살펴보면
다음과 같습니다.
{ ES6 }2. prototype of class
functiondefineProperties(target,props){
for(vari =0;i <props.length;i++){
vardescriptor= props[i];
console.log(descriptor);//{key:'say',value:[Function:say]}
descriptor.enumerable=descriptor.enumerable||false;
console.log(descriptor.enumerable);//false
결국, defineProperties 함수는, 두 번째로 받은 배열의 길이만큼 루프를 돌면서, 필요한 설정을
수행한 다음 Object.defineProperty 함수를 통해 Car.prototype 객체에 프로퍼티를 추가하는
코드입니다.
{ ES6 }2. prototype of class
descriptor.configurable=true;
if("value"in descriptor)
descriptor.writable= true;
console.log(descriptor);
/*
{ key:'say',
value:[Function:say],
enumerable:false,
configurable:true,
writable:true}
*/
Object.defineProperty(target,descriptor.key,descriptor);
}
}
{ ES6 }2. prototype of class
앞서 살펴 본 내용을 간단하게 표로 정리해 보겠습니다.
classCar{
say(){
console.log('Hi');
}
}
letcar= newCar();
console.log(car);//{}
car.say();//Hi
ES6 문법
functionCar(){}
Car.prototype.say=function(){
console.log('Hi');
}
letcar= newCar('A');
console.log(car);//{}
car.say();//Hi
ES5 문법
{ ES6 }2. prototype of class
이번 시간에 살펴 본 주인공은 클래스 범위안에 정의하는 함수였습니다.
ES5 문법에서는 함수를 만들고 난 후, 추가로 상속용 객체에 함수를 정의했다면 ES6 문법에서
는 클래스 범위연산자 안에서 함수를 정의한다는 문법적인 차이만 있을 뿐, 결과적으로 처리
되는 방법은 똑같다는 것을 알 수 있었습니다.
클래스문법으로 작성해도 실체는 함수이므로 기존의 함수문법과 섞어서 사용하는 것이 가능
하고 이는 매우 자연스러운 모습이라는 것을 기억하시면 좋겠습니다.
{ ES6 }2. prototype of class
송석원
현재 :
- 탑크리에듀교육센터 자바, 스프링 프레임워크, JPA, Querydsl,
AngularJS, React, Android 분야 전임강사
경력 :
- 오라클자바커뮤니티교육센터
자바, 스프링, JPA, Node.JS, AngularJS, React, Android 전임강사
- 탑크리에듀 교육센터
Java, Spring Data JPA, Querydsl, SQL 교재 편찬위원
- 회원수 14,000명의 오라클자바커뮤니티 운영 및 관리
- SK T-아카데미 스프링 프레임워크 강의
- 정철 어학원
탑크리에듀교육센터 Tel. 02-851-4790 http://www.topcredu.co.kr
Copyrights ⓒ Topcredu. All rights Reserved.

Mais conteúdo relacionado

Mais procurados

Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리ssuser7c5a40
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
 
호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFEChangHyeon Bae
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식TonyCms
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Circulus
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍Hyunsoo Jung
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 

Mais procurados (20)

Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 
C++11
C++11C++11
C++11
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
Javascript
JavascriptJavascript
Javascript
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 

Semelhante a 자바스크립트 클래스의 프로토타입(prototype of class)

(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...
(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...
(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
ECMA Script 5 & 6
ECMA Script 5 & 6ECMA Script 5 & 6
ECMA Script 5 & 6sewoo lee
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택JinTaek Seo
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2기동 이
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&httpDong Jun Kwon
 
Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Yeon Soo Kim
 
Hacosa js study 2주차
Hacosa js study 2주차Hacosa js study 2주차
Hacosa js study 2주차Seong Bong Ji
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 

Semelhante a 자바스크립트 클래스의 프로토타입(prototype of class) (20)

(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...
(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...
(고급자바스크립트강좌 for AngularJS, React)static of class,class 범위 안에서 static 키워드로 선언하...
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
ECMA Script 5 & 6
ECMA Script 5 & 6ECMA Script 5 & 6
ECMA Script 5 & 6
 
Nodejs express
Nodejs expressNodejs express
Nodejs express
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 
Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수
 
Xe hack
Xe hackXe hack
Xe hack
 
Hacosa js study 2주차
Hacosa js study 2주차Hacosa js study 2주차
Hacosa js study 2주차
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 

Mais de 탑크리에듀(구로디지털단지역3번출구 2분거리)

[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]탑크리에듀(구로디지털단지역3번출구 2분거리)
 

Mais de 탑크리에듀(구로디지털단지역3번출구 2분거리) (20)

자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
 
[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육
 
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
 
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
 
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
 
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
 
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
 
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
 
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
 
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
 
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
 

자바스크립트 클래스의 프로토타입(prototype of class)

  • 1. { for AngularJS, React} 고급 자바스크립트 2. prototype of class 탑크리에듀 IT기술 칼럼 와 함께하는
  • 2. { ES6 }2. prototype of class 먼저, ES5문법에서 사용하던 방식을 살펴보겠습니다. Car 함수를 선언합니다. 그 후에, 함수가 갖고 있는 히든 프로퍼티 prototype이 가리키는 객체에 동적으로 say라는 프로퍼티를 추가하고 이 것이 함수를 가리키게 합니다. 이렇게 하면 함수를 생성자로 사용하여 만들어지는 객체는 say함수를 이용할 수 있습니다. 바로, 자바스크립트의 프로토타입 체이닝을 통해 부모로부터 상속받는 자원을 이용하는 모습입니다. example2.js function Car(){} Car.prototype.say =function() { console.log('Hi'); } let car =new Car('A'); console.log(car); // {} car.say(); // Hi
  • 3. { ES6 }2. prototype of class 그런데, 함수를 선언한 다음에 상속 자원(변수, 함수)을 설정하는 모습이 낯설기도 하고 깜박 잊고 설정하지 않을 수도 있겠지요. 이를 클래스 문법으로 변경하면 함수의 프로토타입 객체에 추가되는 자원도 클래스 범위 안에서 설정합니다. 이렇게 하면, 범위 구분이 확실해서 좋고 기존 자바 개발자들도 클래스를 작성하는 방법이 친숙하게 느껴져서 쉽게 작성할 수 있을 것 입니다. 다음 예제를 살펴보면서 얘기를 나눠보겠습니다. class2.es6 class Car{ say() { console.log('Hi'); } } let car =new Car(); console.log(car); // {} car.say(); // Hi
  • 4. { ES6 }2. prototype of class example2.js와 class2.es6의 코드는 결과적으로 같은 로직을 수행하는 코드입니다. 클래스 문법에서는 클래스의 프로토타입 객체에 추가하는 자원을 클래스 범위 내에서 일반적 인 함수처럼 선언합니다. 클래스 문법에서는 프로토타입 객체에 변수를 추가하는 방법은 지원하지 않습니다. 이를 수행하고자 원한다면 Car.prototype 객체에 직접 추가하는 방법을 사용해서 구현할 수 있 습니다. 클래스는 함수이므로 다음처럼 작성하면 됩니다. class2.es6 class Car{ say() { console.log('Hi'); } } let car =new Car(); console.log(car); // {} car.say(); // Hi console.log(car.number); // undefined Car.prototype.number = 7; console.log(car.number); // 7
  • 5. { ES6 }2. prototype of class 다음으로 example2.es6 파일을 트랜스파일링한 결과코드를 살펴보겠습니다. class2.js 'usestrict'; var_createClass= function(){ functiondefineProperties(target,props){ for(vari= 0;i <props.length;i++){ vardescriptor=props[i]; descriptor.enumerable=descriptor.enumerable|| false; descriptor.configurable= true; if("value"in descriptor) descriptor.writable= true; Object.defineProperty(target,descriptor.key,descriptor); } } returnfunction(Constructor,protoProps,staticProps){ if(protoProps) defineProperties(Constructor.prototype,protoProps); if(staticProps) defineProperties(Constructor,staticProps); returnConstructor;
  • 6. { ES6 }2. prototype of class }; }(); function_classCallCheck(instance,Constructor){ if(!(instanceinstanceofConstructor)){ thrownewTypeError("Cannotcalla classasafunction"); } } varCar=function(){ functionCar(){ _classCallCheck(this,Car); } _createClass(Car,[ { key:'say', value:functionsay(){ console.log('Hi'); } } ]); returnCar; }();
  • 7. { ES6 }2. prototype of class varcar= newCar(); console.log(car);//{} car.say();//Hi console.log(car.number); Car.prototype.number=7; console.log(car.number); //#sourceMappingURL=C:Lessonecmascript20170328what-is-classclass2class2.js.map 코드를 부분적으로 살펴보는 것이 좋겠습니다. : ) var Car = function() { function Car() { _classCallCheck(this, Car); // 생성자로 사용되고 있는지 체크한다. } _createClass(Car, [ { key: 'say', value: function say() { console.log('Hi');
  • 8. { ES6 }2. prototype of class } } ]); returnCar; }(); 함수를 선언하면서 즉시 실행하고 있으므로 “var Car”가 할당받는 결과는 “return Car;” 코드에 따라서 지역함수인 Car입니다. 이 때 지역함수 Car는 필요한 작업이 수행된 함수입니다. 어떤 작업을 수행한 후에, 지역함수 Car를 리턴하는지 살펴보겠습니다. _createClass(Car,[ { key:'say', value:functionsay(){ console.log('Hi'); } } ]); _createClass 함수의 파라미터로 다음 데이터를 전달하고 있습니다.
  • 9. { ES6 }2. prototype of class var_createClass= function(){ functiondefineProperties(target,props){ for(vari= 0;i <props.length;i++){ vardescriptor=props[i]; descriptor.enumerable=descriptor.enumerable|| false; descriptor.configurable= true; if("value"in descriptor) descriptor.writable= true; Object.defineProperty(target,descriptor.key,descriptor); } } returnfunction(Constructor,protoProps,staticProps){ if(protoProps) defineProperties(Constructor.prototype,protoProps); if(staticProps) defineProperties(Constructor,staticProps); returnConstructor; }; }(); _createClass가 가리키는 함수는 어떤 상태인지 살펴봅니다.
  • 10. { ES6 }2. prototype of class returnfunction(Constructor,protoProps,staticProps){ if(protoProps) defineProperties(Constructor.prototype,protoProps); if(staticProps) defineProperties(Constructor,staticProps); returnConstructor; }; 함수를 선언한 후 즉시실행하고 있으므로 _createClass가 가리키는 함수는 다음과 같습니다. _createClass(생성자함수,프로토타입객체에추가될자원,생성자함수객체에직접추가될정적인자원) 이 때, 전달되는 파라미터의 존재여부에 따라서 기동하는 함수 defineProperties 함수는 외부 스코프에 있으므로 클로져가 됩니다. 위 코드를 정리하면 다음과 같습니다. if(protoProps) defineProperties(Constructor.prototype,protoProps); 현재, 프로토타입객체에 추가될 자원만 존재하므로, 다음 조건만이 만족됩니다.
  • 11. { ES6 }2. prototype of class 첫번째파라미터:Car.prototype, 두번째파라미터: [ { key:'say', value:functionsay(){ console.log('Hi'); } } ] Object.defineProperty 메소드는 target객체에 새 프로퍼티를 정의하거나 기존 프로퍼티를 수 정하는 메소드입니다. 결과로 수정된 객체를 리턴하는데 여기서는 리턴 값을 사용하고 있지는 않고 있습니다. Constructor.prototype, protoProps으로 전달되는 파라미터의 실체를 환원해서 살펴보면 다음과 같습니다.
  • 12. { ES6 }2. prototype of class functiondefineProperties(target,props){ for(vari =0;i <props.length;i++){ vardescriptor= props[i]; console.log(descriptor);//{key:'say',value:[Function:say]} descriptor.enumerable=descriptor.enumerable||false; console.log(descriptor.enumerable);//false 결국, defineProperties 함수는, 두 번째로 받은 배열의 길이만큼 루프를 돌면서, 필요한 설정을 수행한 다음 Object.defineProperty 함수를 통해 Car.prototype 객체에 프로퍼티를 추가하는 코드입니다.
  • 13. { ES6 }2. prototype of class descriptor.configurable=true; if("value"in descriptor) descriptor.writable= true; console.log(descriptor); /* { key:'say', value:[Function:say], enumerable:false, configurable:true, writable:true} */ Object.defineProperty(target,descriptor.key,descriptor); } }
  • 14. { ES6 }2. prototype of class 앞서 살펴 본 내용을 간단하게 표로 정리해 보겠습니다. classCar{ say(){ console.log('Hi'); } } letcar= newCar(); console.log(car);//{} car.say();//Hi ES6 문법 functionCar(){} Car.prototype.say=function(){ console.log('Hi'); } letcar= newCar('A'); console.log(car);//{} car.say();//Hi ES5 문법
  • 15. { ES6 }2. prototype of class 이번 시간에 살펴 본 주인공은 클래스 범위안에 정의하는 함수였습니다. ES5 문법에서는 함수를 만들고 난 후, 추가로 상속용 객체에 함수를 정의했다면 ES6 문법에서 는 클래스 범위연산자 안에서 함수를 정의한다는 문법적인 차이만 있을 뿐, 결과적으로 처리 되는 방법은 똑같다는 것을 알 수 있었습니다. 클래스문법으로 작성해도 실체는 함수이므로 기존의 함수문법과 섞어서 사용하는 것이 가능 하고 이는 매우 자연스러운 모습이라는 것을 기억하시면 좋겠습니다.
  • 16. { ES6 }2. prototype of class 송석원 현재 : - 탑크리에듀교육센터 자바, 스프링 프레임워크, JPA, Querydsl, AngularJS, React, Android 분야 전임강사 경력 : - 오라클자바커뮤니티교육센터 자바, 스프링, JPA, Node.JS, AngularJS, React, Android 전임강사 - 탑크리에듀 교육센터 Java, Spring Data JPA, Querydsl, SQL 교재 편찬위원 - 회원수 14,000명의 오라클자바커뮤니티 운영 및 관리 - SK T-아카데미 스프링 프레임워크 강의 - 정철 어학원 탑크리에듀교육센터 Tel. 02-851-4790 http://www.topcredu.co.kr Copyrights ⓒ Topcredu. All rights Reserved.