티스토리 뷰
[Github/Javascript-OOP-AOP-IoC] 자바스크립트 객체지향 프로그래밍 (github)
POWERUMC 2014. 11. 16. 22:06Javascript-OOP-AOP-IoC / 자바스크립트 객체지향 프로그래밍
자바스크립트 객체지향 프로그램을 쉽게 하기 위한 소스 코드를 github 에 공개(https://github.com/powerumc/Javascript-OOP-AOP-IoC)했다.
자바스크립트로 객체지향 프로그래밍을 잘 하려면 배워야 하는 것들이 참 많다. 함수형 프로그래밍과 자바스크립트의 prototype 기반의 chain, 함수를 인스턴스로 사용하고, 객체지향적인 몇 가지 자바스크립트 패턴을 익혀야 하는 데, 쉽지만은 않을 것이다. C
가장 간단한 객체지향 코드를 보자. 이 코드는 Program 클래스를 상속 받은 Outlook 클래스가 있고, run() 메서드로 실행하는 코드다.
function INHERITANCE(PARENT, CLASS) {
for(var p in PARENT) if(PARENT.hasOwnProperty(p)) CLASS[p] = PARENT[p];
var PROXY = function() { };
PROXY.prototype = PARENT.prototype;
CLASS.prototype = new PROXY();
CLASS.prototype.constructor = CLASS;
}
var Program = (function() {
Program.prototype.version = "1.0.0";
return Program;
});
var Outlook = (function() {
INHERITANCE(Program, Outlook);
function Outlook() {
Program.apply(this, arguments);
}
Outlook.prototype.run = function() { console.log("[" + this.version + "] Running... "); }
return Outlook;
})(Program);
var outlook = new Outlook();
outlook.run();
너무 성급하게 이해하지 않아도 된다.
조금이라도 쉽게 Javascript 객체지향을 하기 위해 만든 라이브러리를 공개했으니...
설치
- npm
npm install javascript-oop-aop
- bower
bower install javascript-oop-aop-ioc
1. 기초
이 라이브러리를 이용하면 매우 쉽게 클래스를 선언할 수 있습니다. oop.class(...) 를 사용합니다.
oop.class( [parents,] classInfo )
- 클래스 선언
var Program = oop.class({
say: function() { return "Hello"; }
});
var p = new Program();
p.say();
// return "Hello"
프로퍼티 선언
- 기본적인 프로퍼티 선언
// Define class.
var Program = oop.class({
say: function() { return "Hello"; },
name: "엄준일"
});
var p = new Program();
console.log("My name is ", p.name);
// output
My name is 엄준일
- 사용자 정의 get/set 프로퍼티 선언
var Program = oop.class({
say: function() { return "Hello"; },
name: "엄준일",
age: { get: function() { return this._age; },
set: function(value) { this._age = value; }
});
var p = new Program();
p.age = 35;
console.log("My age is ", p.age);
// output
My age is 35
2. 상속
oop.class( parents, classInfo )
- 부모 클래스 상속하기
// Define parent class
var Program = oop.class({
version: "1.0.2",
show: function() {
console.log("openning window.");
/* some code.. */
}
});
// Define class.
var Outlook = oop.class( Program, {
run: function() { console.log("running outlook program."); }
});
// Run code.
var outlook = new Outlook();
console.log("version " + outlook.version);
outlook.run();
outlook.show();
// Output
version 1.0.2
running outlook program.
openning window.
- 자기 자신 참고 (this or self)
var Program = oop.class({
version: "1.0.2",
show: function() {
console.log("openning window.");
/* some code.. */ }
});
var Outlook = oop.class( Program, {
run: function(self) { // inject 'self' argument name.
console.log("running outlook program.");
// *** HERE ***
// a method call inhertianced Program.show method.
self.show();
}
});
var outlook = new Outlook();
console.log("version " + outlook.version);
outlook.run();
//outlook.show(); remove this line.
// Output
version 1.0.2
running outlook program.
openning window.
부모 인스턴스 참조
var Program = oop.class({
run: function() { console.log("run Program.") }
});
var Outlook = oop.class( Program, { // HERE inheritance Program class.
run: function(base) \
console.log("run Outlook.");
// *** HERE ***
// You can call parent method from base keyword.
base.run();
}
});
// Output
// run Outlook.
// run Program.
3. 인젝션 (주입)
oop.inject( [argument], ... )
- 매개변수 주입
var Program = oop.class({
version: "v1.0"
});
var Outlook = oop.class( Program, {
version: "v2.0",
run: function(base, self) {
console.log("base version: " , base.version)
console.log("current version: ", self.version);
}
});
var outlook = new Outlook();
outlook.run();
// Output
base version: v1.0
current version: v2.0
- 컨테이너로부터 주입
4. 가로채기 - AOP
oop.interception( function, behavior )
oop.interceptionBehavior( before, after, exception, finally_ )
클래스 또는 메서드 가로채기
- 메서드 가로채기
var Program = oop.class({
run: function(msg) { console.log("run Program. ", msg); }
});
// *** HERE ***
// Setup the interception a method
var p = new Program();
oop.interception( p.run, oop.behaviors.LoggingBehavior );
// Call a 'run' method.
p.run("Now running...");
// Output
------ enter interception ------
[Thu Nov 13 2014 09:29:41 GMT+0900 (KST)] {}
run Program. Now running...
------ end interception ------
- 클래스 인스턴스 가로채기
var Program = oop.class({
run: function() { console.log("run Program.", msg); },
terminate: function() { console.log("Terminated the Program.") }
});
// *** HERE ***
// Pass class instance arguments
var p = new Program();
oop.interception( p, oop.behaviors.LoggingBehavior );
// Call a 'run' method.
p.run("Now running...");
p.terminate();
// Output
------ enter interception ------
[Thu Nov 13 2014 09:29:41 GMT+0900 (KST)] {}
run Program. Now running...
Terminated the Program.
------ end interception ------
사용자 정의 가로채기 (Behaviors)
- 사용자 정의 가로채기 정의
가로채기 행위를 사용자 정의로 만드시려면 oop.interceptionBehavior 메서드를 호출합니다.
var customBehavior = oop.interceptionBehavior(
function() { console.log("before"); },
function() { console.log("after"); },
function() { console.log("throw exception"); },
function() { console.log("finally"); }
);
var Program = oop.class({
run: function() { console.log("run Program."); }
});
var p = new Program();
oop.interception(p, customBehavior);
p.run();
// Output
before
run Program.
after
finally
코드가 실행 중 예외가 발생할 경우 다음 처럼 exception 함수가 실행됩니다.
var Program = oop.class({
run: function() {
console.log("run Program.");
throw "crashing... ";
}});
var p = new Program();
oop.interception(p, customBehavior);
p.run();
// Output
before
run Program.
throw exception crashing... // HERE exception behavior.
finally
- Total
- Today
- Yesterday
- ***** MY SOCIAL *****
- [SOCIAL] 페이스북
- [SOCIAL] 팀 블로그 트위터
- .
- ***** MY OPEN SOURCE *****
- [GITHUB] POWERUMC
- .
- ***** MY PUBLISH *****
- [MSDN] e-Book 백서
- .
- ***** MY TOOLS *****
- [VSX] VSGesture for VS2005,200…
- [VSX] VSGesture for VS2010,201…
- [VSX] Comment Helper for VS200…
- [VSX] VSExplorer for VS2005,20…
- [VSX] VSCmd for VS2005,2008
- .
- ***** MY FAVORITES *****
- MSDN 포럼
- MSDN 라이브러리
- Mono Project
- STEN
- 일본 ATMARKIT
- C++ 빌더 포럼
- .
- .NET Framework 4.0
- Team Foundation Server 2010
- github
- mono
- umc
- Visual Studio 2008
- Visual Studio
- testing
- test
- TFS
- ALM
- LINQ
- Silverlight
- 비주얼 스튜디오 2010
- 비주얼 스튜디오
- Team Foundation Server
- TFS 2010
- monodevelop
- Windows 8
- Visual Studio 11
- ASP.NET
- MEF
- Managed Extensibility Framework
- POWERUMC
- 엄준일
- .NET
- c#
- 땡초
- Visual Studio 2010
- 팀 파운데이션 서버