아웃룩 과 Google Calendar 싱크 맞추는 프로그램

'IT' 카테고리의 다른 글

컴팩 프리자리오 M2000 설명서  (0) 2009.05.24
SKT EIF 문서  (0) 2009.05.24
Telnet 으로 port 확인  (2) 2009.03.18
JavaScript - OOP 와 prototype  (2) 2009.02.17
Prototype Javascript Framework  (0) 2009.02.16
웹 서버와 연동되는 서버 장비들의 서비스 확인을 위하여 필요한 서비스 ?
손으로 일일이 확인 하던게 귀찮아서 -ㅅ-

1. Socket 통신
ip, port 접속 확인(기본 원리는 telnet)
2. Xml 읽기
xml 리스트에서 여러대의 서버 리스트 읽기
3. Text 파일 저장
성공과 실패 여부를 출력



압축 비밀번호 해제 하였습니다.
소스가 부끄러워요 -_-;;

'IT' 카테고리의 다른 글

SKT EIF 문서  (0) 2009.05.24
Google Sync  (0) 2009.05.20
JavaScript - OOP 와 prototype  (2) 2009.02.17
Prototype Javascript Framework  (0) 2009.02.16
VS 단축키  (0) 2009.02.09

JavaScript OOP, Prototype)

1. 객체에 속성이용

man.name="홍길동";

Man["name"] = "홍길동";

 

 

 

2. 함수 추가

1) 익명의 함수 이용

(함수의 이름이 없고 몸체만있는 함수) 

Man.getName = fuction(){

       return this.name;

}

 

 

 

 

 

2) 객체 외부 함수 이용

function printName()

{

       alert(this.name);

}

Man.getName = printName; // 괄호를 사용하지 않음

 

 

 

3. 객체 생성

 

1) new Object(); 방식

 new Object();

 var man = new Object();

 man.name = "홍길동";

 

 

2) 생성자이용

function ManObject(name, height){

       this.name = name;

       this.height = height;

}

Var man = new ManObject("홍길동", 170);

Alert(man.name + " / " + man.height);

 

3) 생성자를 이용한 방식에서 클래스에 메소드 추가

function ManObject(name, height){

 this.name = name;

 this.height = height;

 

this.getName = function(){

       return this.name

} // 생성자에 직접 함수 정의

}

 

Prototype 속성은 모든 자바스크립트 객체의 기본속성이다.

--어떤 객체의 prototype 속성이나 함수를 정의 한다는 것은 앞으로 객체에 공통적으로 적용되는 속성이나 함수를 정의한다는 의미

 

 

 

 

4.Prototype 이용

function ManObject(name, height){

       this.name = name;

       this.height = height;      

} // 생성자를 만들고 함수는 생성자 안에 지정하지 않음

 

ManObject.prototype.getName = function(){

       return this.name;

} // prototype 속성에 새로운 함수를 붙임

 

 

생성자에 함수 정의

인스턴스를 여러 만들때 인스턴스는 메모리로 상주. 인스턴스마다 함수와 같이 생김

Prototype 이용

함수가 단한번 만들어지고 모든 인스턴스는 프로로타입 함수를 공유한다.

객체안에 내장된 함수가 객체의 지역변수를 자신의 지역변수처럼 사용할 경우 이러한 함수를 클로저라 한다.

 

 

 

 

5.클로저

1-1) 클로저 발생 하는 경우

function MyObject(){

       var startTime = new Date();

       this.elapsedTime = function(){

              var now = new Date();

              var elapsed = now - startTime;

              return elapsed;

       }

}      // 클로저 : startTime 함수 안에 없고, 클래스 변수         //startTime 참조함

       //클로저발생 => 함수 안에서 사용하는 외부의 지역변수는

       //깨긋이 지워지지 않고 함수에 묶여있어 메모리 누수현상발생.

  

 

 

 

 

1-2) 참조할수 있는 startTime이 없어 오류발생 하는 경우

function MyObject(){

       var startTime = new Date();

       this.elapsedTime = getElapsed;

}

function getElapsed(){

     var now = new Date();

     var elapsed = now + startTime();        return elapsed;

}

 

 

 

1-3) 클로저 발생안되게 사용하는 방법

function MyObject(){

       this.startTime = new Date();

}

MyObject.prototype.elapsedTime = function(){

      var now = new Date();

      var elapsed = now + this.startTime;      

      return elapsed;

}

 

 

 

 

 

 

6.Prototype 성질 

 

1) Prototype 속성 변경  

이전에 만들 객체의 속성은 자동으로 변경

 프로토 타입 영역의 속성은 모든 인스턴스간에 공유

function MyObject(){ }

 

MyObject.prototype.color = "blue";

var obj1 = new MyObject();

alert(obj1.color); // blue

MyObject.prototype.color = "red";

car obj2 = new MyObject();

alert(obj1.color + " / " + obj2.color); // red / red

 

 

 

 

2) Prototype 이용한 내장객체 확장

Object.prototype.log = function(){

document.write("this:" + this);

//최상위 객체인 Object 프로토타입에 log함수 추가 => 모든 자바스크립트 객체, 변수에 대해서 log메소드 사용가능

}

var arr = new Array(0,1,2);

arr.log(); // this : 0, 1, 2

var name = "mike";

name.log(); // this : mike

var sum = 1 + 3;

sum.log();       //this : 4

 

 

 

 

 

 

7. 자바스크립트 객체의 상속

1-1) 상속 - prototype 을 이용한 부모 클래스 지정방법 (부모클래스 생성자 매개변수 없는경우)

function ManObject(){ }

       ManObject.prototype.eyeCnt = 2;

       ManObject.prototype.getEyeCnt = function(){

              return this.eyeCnt;

}

function AsianMan(){

       this.eyeColor = "black";

}

AsianMan.prototype = new ManObject();//AsianMan 부모클래스는 ManObject

 

 

function WesternMan(){

       this.eyeColor = "blue";

}

WesternMan.prototype = new ManObject();//WesternMan 부모클래스는 ManObject

 

 

var HongGilDong = new AsianMan();

var smith = new WesternMan();

 

alert(HongGilDong.eyeCnt); // 2

alert(HongGilDong.eyeColor); // black

alert(HongGilDong.getEyeCnt()); // 2

alert(smith.eyeCnt); //2

alert(smith.eyeColor); // blue

alert(smith.getEyeCnt()); // 2

 

 

 

 

 

 

 

1-2) 상속 - prototype 을 이용한 부모 클래스 지정방법 (부모클래스 생성자 매개변수 있는경우)

/**

 * 사람 클래스

 * @param {String} name

 * @param {String} age

 */

function Person(name){

       this.name = name;

 

       this.getName = function(){

              return this.name;

       }

}

 

var gradeEnum = {

       one        : 1 ,

       two        : 2,

       tree       : 3

}

 

function Student(name, schoolName){      

       this.schoolName = schoolName;      

       this.getSchoolName = function (){

              return this.schoolName;

       }      

             

       this.grade;

       this.getGrade = function(){

              return this.grade;

       }      

}

Student.prototype = new Person("홍길동"); //순서가 중요.제일 먼저Student.prototype을 지정해야함.

 

/**

 * prototype 이용한 setGrade 메소드 확장

 * @param {gradeEnum} grade

 */

Student.prototype.setGrade = function (grade){

       this.grade = grade;

}

var student = new Student("홍길동" ,  "홍길동대학교");

alert(student.getName());                    //홍길동

alert(student.getSchoolName());              //홍길동대학교

student.setGrade(gradeEnum.tree);      

alert(student.getGrade());                   //3

 

 

 

 

 

 

 

2-1) 상속 - base 속성,메소드를 이용한 방법(부모클래스 생성자 매개변수 없는경우)

function ManObject(){

       this.eyeCnt = 2;

       this.getEyeCnt = function(){

              return this.eyeCnt;

       }

}

 

 

// AsianMan 부모클래스는 ManObject;

function AsianMan(){

       this.base = ManObject;

       this.base();

       this.eyeColor = "black";

}

 

 

 

 

 2-2) 상속 - base 속성,메소드를 이용한 방법(부모클래스 생성자 매개변수 있는경우) 

/**

 * 사람 클래스

 * @param {String} name

 * @param {String} age

 */

function Person(name){

       this.name = name;

 

       this.getName = function(){

              return this.name;

       }

} 

 

var gradeEnum = {

       one        : 1 ,

       two        : 2,

       tree       : 3

} 

function Student(name, schoolName){      

       this.base = Person;             //부모클래스 지정

       this.base(name);                //부모클래스 생성자호출

 

       this.schoolName = schoolName;      

       this.getSchoolName = function (){

              return this.schoolName;

       }      

             

       this.grade;

       this.getGrade = function(){

              return this.grade;

       }      

}

  

/**

 * prototype 이용한 setGrade 메소드 확장

 * @param {gradeEnum} grade

 */

Student.prototype.setGrade = function (grade){

       this.grade = grade;

}

 

var student = new Student("홍길동" ,  "홍길동대학교");

alert(student.getName());                    //홍길동

alert(student.getSchoolName());              //홍길동대학교

student.setGrade(gradeEnum.tree);      

alert(student.getGrade());                   //3

 

 

 

 

 

 

 

 

9. for 문의 재발견 

for(var param in args){

       alert(param);

}

 

 

 

 

 

 

 

 

마치며)

이로써 간단하게나마 JavaScript OOP와 더불어 prototype속성에 대해서도 알아보았습니다.

아참, prototype.js 라는 JavaScript 프레임워크 추천합니다.

하지만 코드의 가독성이 떨어진다, 맘에 안든다 하시는분은 prototype.js 에서 지원하는

Ajax쪽만 활용하셔도 괜찮을듯 싶네요..

 

아울러 JavaScript로 XML관련 핸들링하는것도 제 블로그에 있으니 참고하시구요.

(http://blog.naver.com/jadin1/70008395017)

 

[출처] [DEV.WON] JavaScript - OOP 와 prototype|작성자 데브원

'IT' 카테고리의 다른 글

Google Sync  (0) 2009.05.20
Telnet 으로 port 확인  (2) 2009.03.18
Prototype Javascript Framework  (0) 2009.02.16
VS 단축키  (0) 2009.02.09
현재 컴퓨터에 설치된 디바이스 장치 정보 알아오기  (0) 2009.02.09
정리는 Prototype의 최신버젼인 1.6을 기준

1. $

이 명령은 엘리먼트의 id값을 입력하면 매치되는 엘리먼트를 찾아 리턴하는 함수 입니다. Prototype에서 제공하는 DOM 확장 함수를 상속(상속이라 보긴 어렵지만 상속을 흉내내고 있습니다) 받아 그 결과가 반환됩니다.
id뿐만 아니라 엘리먼트를 인자로 넣어도 마찬가지로 Prototype DOM 확장 함수들을 상속받아 그 결과가 반환됩니다.

$(id | element) // 엘리먼트가 반환됩니다.$((id | element) ...) // 다수의 id나 element를 입력할 경우 동일한 수의 엘리먼트 배열이 반환됩니다.
자바스크립트 Native Function의 document.getElementById 와 동일한 일을 합니다.
document.getElementById('id') -> $('id') 이렇게 줄일 수 있다니 정말 편하고 좋군요!

해당 함수가 어떻게 작동을 하는지 볼까요?
function $(element) {  // 입력된 인자가 2개 이상이라면  if (arguments.length > 1) {    // elements라는 배열을 만들어 인자 수 만큼 순환    for (var i = 0, elements = [], length = arguments.length; i < length; i++)      // 입력된 인자를 다시한번 재귀 호출로 자기 자신을 호출하여 그 결과를 elements 배열에 넣음      elements.push($(arguments[i]));    // 결과 리턴    return elements;  }  // 입력된 인자가 1개 이하라면 해당 인자가 문자열인지 확인한다  if (Object.isString(element))    // 모두들 아실 document.getElementById 입니다.    element = document.getElementById(element);  // 가져온 element를 Prototype Element를 상속받아 반환합니다.  return Element.extend(element);}


2. $$

이녀석은 CSS 셀렉터라고 불리우는 녀석입니다. 매우 편리하며 또 강력하고 보통 작업에 앞서 필요한 모든걸 해낼 수 있는 강력한 녀석입니다.

하지만 http://mootools.net/slickspeed/ 의 테스트 결과를 보시면 아시겠지만 여러 CSS 셀렉터를 제공하는 JS Framework중에 Prototype은 극악의 퍼포먼스를 보여줍니다.

그러므로, 사용은 자제하도록 합시다. 물론 필요한 부분에선 사용해야겠죠^^

그래도 다행인게 1.5시절에는 사용할려고 쳐도 무언가 엄청나게 복잡했었는데 1.6들어 딱 보면 무엇을 뜻하는지 알 수 있을 정도로 단순화 되고 명시적으로 바뀌었습니다.

CSS 셀렉터는 $()와 거의 같은 일을 하지만 다양한 조건을 두고 원하는 엘리먼트를 가져올 수 있습니다.

$$('div');// -> document에 존재하는 모든 DIV 엘리먼트를 가져옵니다. // -> document.getElementsByTagName('div')와 동일합니다. $$('#contents');// -> 이것은 $('contents')와 동일합니다.


이것은 Protptype의 Element 클래스의 getElementsBySelector 메서드와 동일합니다.

<ul id="fruits">   <li id="apples">     <h3 title="yummy!">Apples</h3>     <ul id="list-of-apples">       <li id="golden-delicious" title="yummy!" >Golden Delicious</li>       <li id="mutsu" title="yummy!">Mutsu</li>       <li id="mcintosh">McIntosh</li>       <li id="ida-red">Ida Red</li>     </ul>     <p id="saying">An apple a day keeps the doctor away.</p>   </li> </ul>


$('apples').getElementsBySelector('[title="yummy!"]'); // -> [h3, li#golden-delicious, li#mutsu] 배열이 반환 됨

$('apples').getElementsBySelector( 'p#saying', 'li[title="yummy!"]'); // -> [li#golden-delicious, li#mutsu, p#saying] 배열이 반환됨

$('apples').getElementsBySelector('[title="disgusting!"]'); // -> [] 빈 배열이 반환됨



ul 이하의 li들을 prototype 상속을 받은 map 형식으로 리턴할려면 다음과 같이 해야 하지만 셀렉터는 더 쉽습니다.

var nodes = $A(someUL.getElementsByTagName('li')).map(Element.extend); var nodes2 = someUL.getElementsBySelector('li');


다시한번 완벽하게 알아볼겸 복습해 볼까요?

<ul>  <li id="yellow">홍길동</li>  <li class="blue">이순신</li>  <li title="nice">유관순</li></ul>


$$('li');// -> [li#yellow, li.blue, li] 배열이 반환됨 $$('li#yellow');// -> [li#yellow] #은 id를 뜻함. li 엘리먼트 중에 yellow라는 id를 가진 엘리먼트를 찾아 반환함 $$('#yellow');// -> [li#yellow] yellow id를 가진 엘리먼트를 찾아 반환함 $$('li[title=nice]');// -> [li] 배열 반환// -> [] 으로 감싼 부분은 속성을 뜻함. li객체중에 title속성의 값이 'nice' 인 엘리먼트를 찾아 반환 $$('[title=nice]');// -> [li] 배열 반환// -> 모든 엘리먼트중에 title속성의 값이 'nice'인 엘리먼트를 찾아 반환


마지막으로 prototypejs.org에 있는 예제도 한번 보도록 하죠.

$$('#contents a[rel]'); // -> 모든 a 엘리먼트중에 contents라는 id를 가지고 rel 속성을 가지고 있는 엘리먼트 반환 $$('a[href="#"]');// -> 모든 a 엘리먼트중에 href 속성이 #인 엘리먼트 반환 $$('#navbar a', '#sidebar a'); // -> 모든 a 엘리먼트중에 id가 navbar거나 sidebar인 엘리먼트 반환 


3. $A

이 함수는 배열과 비슷하게 순서를 가지고 반복 처리 가능한 값을 가지고 있지만 배열은 아닌 값을 배열로 바꿔주는 역할을 합니다.

실제로 이 함수는 Array 클래스의 form 메서드와 같습니다.

예로 잘 알고 계실 DOM 메서드인 document.getElementsByTagName() 의 결과는 배열로 반환하지 않습니다.

반환되는 노드리스트를 배열로 바꾸어 보도록 하겠습니다.

var paras = $A(document.getElementsByTagName('p'));paras.each(Element.hide); $(paras.last()).show();


document 이하의 모든 p 엘리먼트를 찾아서 Element 상속을 받고 마지막 엘리먼트를 show()하는 명령문입니다.

하지만 신기하게 $()와 달리 반환된 값에 다시한번 Element상속을 받아야 하는군요. $()함수는 자동으로 상속받아 반환되는데 말이죠.

실제로 $A()함수는 Element 상속을 하지 않습니다. 그래서 반환되는 전체 배열을 한꺼번에 상속하기 위해서는 다음과 같이 사용하면 됩니다.

$A(document.getElementsByTagName('p')).map(Element.extend).invoke('hide'); 


invoke는 배열이나 Enumerable한 객체들의 하나하나의 엘리먼트들에게 개개별로 명령을 내리는 함수입니다.

위의 과정을 거치면 모든 p 엘리먼트는 사라지겠네요.

$A() 함수의 소스를 한번 봐볼까요?

function $A(iterable) {  // 입력된 값이 빈 값을 경우 빈 배열을 반환  if (!iterable) return [];  // Prototype의 메서드인 toArray가 있을 경우 해당 메서드를 실행하여 반환  if (iterable.toArray) return iterable.toArray();  // 입력된 값의 길이를 가져온다. 없을 경우 0으로 함  // results라는 이름의 배열을 생성한다  var length = iterable.length || 0, results = new Array(length);  // 새로만든 results 배열로 값 복사  while (length--) results[length] = iterable[length];  // 결과 반환  return results;}


마지막으로 prototypejs.org의 예제를 보죠.

// 어려운 방법function showArgs() {   alert(Array.prototype.join.call(arguments, ', ')); }

// 쉬운 방법function showArgs() {   alert($A(arguments).join(', ')); }



4. $F

이 함수는 Form과 관련된 함수입니다. 정확하게는 Form.Element 클래스의 getValue 메서드의 참조입니다.

Form.Element는 폼과 관련된 엘리먼트만을 제어하는 클래스입니다.

해당되는 엘리먼트로는 input, select, textarea가 있습니다.

$F를 사용하지 않고 특정 값을 가져오는 방법은 다음과 같은 방법이 있습니다.

var form = $('contact'); // -> contact 라는 id를 가진 form을 가져옴 var input = form['company']; // -> form 이하의 name이 company 폼 엘리먼트를 가져옴 Form.Element.getValue(input);// -> 폼 엘리먼트의 값을 가져옴 // 혹은 다음과 같은 짧은 방법이 있음$(input).getValue();


하지만 이 모든걸 간단하게 해결할 수 있습니다.

$F(input);


괜찮아 보이나요? 여기서 중요한건 엘리먼트를 직접 인자로 넣어주거나 id명을 입력해 주어야 합니다.

prototype의 소스를 봐보죠.

var $F = Form.Element.Methods.getValue;


실제로 $F의 실체는 없고 getValue 메서드를 참조하고 있군요.

getValue를 봐봐야 겠습니다.

Form.Element.Methods = {  getValue: function(element) {    // 입력받은 엘리먼트를 Element 상속 받음
    element = $(element);    // 엘리먼트의 tagName을 소문자로 바꾸어 method에 저장
    var method = element.tagName.toLowerCase();    // Form.Element.Serializers 클래스 이하의 method 메서드를 수행함
    // Form.Element.Serializers.method 라고 하면 진짜 method를 찾겠죠
    // 이와 같이 하면 동적으로 메서드를 호출할 수 있음

   
return Form.Element.Serializers[method](element);  }}


이쯤 되면 저 Serializers가 궁금해 지는군요. 조금 길긴 하지만 봐보죠.

Form.Element.Serializers = {  input: function(element, value) {    // 엘리먼트의 타입을 확인    switch (element.type.toLowerCase()) {      case 'checkbox':      case 'radio':        // 체크박스와 라디오는 다음의 메서드를 다시한번 호출하여 결과를 반환        return Form.Element.Serializers.inputSelector(element, value);      default:        // 기타 나머지는 textarea로 판단        return Form.Element.Serializers.textarea(element, value);    }  },

  inputSelector: function(element, value) {    // value 값이 없으므로 엘리먼트의 checked값이 참이면 value를 반환하고 거짓이면 null 반환    if (Object.isUndefined(value)) return element.checked ? element.value : null;    else element.checked = !!value;  },

  textarea: function(element, value) {    // value값이 없으므로 엘리먼트의 value값이 반환    if (Object.isUndefined(value)) return element.value;    else element.value = value;  }};



보시면 아시겠지만 input의 type이 checkbox와 radio일 경우를 제외한 모두를 textarea와 동일하게 처리합니다.

5. $H

이 함수는 크게 설명할 것이 없는 녀석인것 같네요. 일반 Object를 Hash로 바꾸어 줍니다.

바꾸는 과정은 전적으로 Hash의 생성자에게 맡겨 버리네요.

prototype 소스를 볼까요?

function $H(object) {  return new Hash(object);};


주석을 달려고 봐도 달 곳이 없네요. 썰렁하죠?

6. $R

이 함수는 별로 쓸모 없는 듯 하면서도 매우 유용한 함수입니다. 실제로 많은 prototype 애용자 분들이 거의 안쓰는 유틸리티 함수일 겁니다.

시작과 끝을 정해주면 배열 형태의 ObjectRange 객체를 반환합니다. 다음의 예제를 보시죠.

$R(0, 10).include(10) // -> true 반환, 10이 포함되어 있는지 확인$A($R(0, 5)).join(', ') // -> '0, 1, 2, 3, 4, 5' $A($R('aa', 'ah')).join(', ') // -> 'aa, ab, ac, ad, ae, af, ag, ah' $R(0, 10, true).include(10) // -> false 반환, 10이 포함되었나 확인하는 명령문, 3번째 인자가 true로 10이 포함되지 않음$R(0, 10, true).each(function(value) {   // 10번 실행되며 value값은 0부터 9까지 증가}); 


위의 예제만 보아도 아셨겠지만 첫번째 인자는 시작할값, 두번째 인자는 종료 값, 세번째는 true 혹은 false를 인자로 받으며 종료 값을 포함할지 말지입니다.

true로 하면 종료 값은 포함되지 않습니다.

ObjectRange 값은 Enumarable 클래스역시 포함하고 있으며 해당 메서드를 사용할 수 있습니다.

toArray라던가 max(), min() 같은것 역시 사용할 수 있습니다.

7. $w

신기하게도 이번의 함수는 소문자 w이네요. 잘 알아두시기 바랍니다.

이번 함수 역시 희안하게도 별로 안쓰이는 녀석입니다. 하지만 확실히 생각해 보면 prototype개발자가 별로 쓸모없는 기능을 유틸리티로 끌어내진 않았겠죠.

잘 생각해 보면 정말 괜찮은 기능입니다. 문자열의 모든 whitespace(공백, 탭, 줄바꿈)를 기준으로 문자열을 분리하여 배열로 반환합니다.

$w('apples bananas kiwis') // -> ['apples', 'bananas', 'kiwis'] 배열 반환


예제만 보셔도 알겠죠? 정말 간단하고 단순한 함수네요. 그렇다면 이것으로 무엇을 할 수 있을까요?

$w('apples bananas kiwis').each(function(fruit){   var message = 'I like ' + fruit;   // 메시지와 함께 무언가를 처리})


솔직히 써놓고 보니깐 조금 민망하네요. 적으면서 스스로도 무언가 쓸데없는 짓을 한 기분입니다.

그럼 실용 예제를 볼까요.

$w('ads navbar funkyLinks').each(Element.hide);


위와 같이 하면 ads, navbar, funkyLinks라는 id를 가진 엘리먼트를 숨기는 작업을 할 수 있습니다.

하지만!!!!!!!!!!!!!!

['ads', 'navbar', 'funkyLinks'].each(Element.hide);


이게 더 좋아보이는 이유는 뭘까요........

아무튼 소스라도 한번 보도록 하겠습니다.

function $w(string) {  // 입력된 값이 문자열이 아닐경우 빈 배열 반환  if (!Object.isString(string)) return [];  // 일반 프로그래밍의 trim에 해당하는 문자열 좌우 공백 제거  string = string.strip();  // 문자열 값이 있으면 정규식 \s(whitespace)로 split, 없다면 빈 배열 반환  return string ? string.split(/\s+/) : [];}


8. Try.these

매우 멋지고 훌륭한 유틸리티 함수입니다. 많이들 모르시는거 같던데 무엇인가 살펴보죠.

Try.these를 보고 try~catch 를 생각하신 분들이 있을 것 같네요. 비슷합니다.

하지만 조금 다른게 있다면 try~catch는 실행중에 에러가 발생하면 catch로 던져 버리는 반면

Try.these는 실행되는 놈들을 찾을때까지 계속 해본다는것이 조금 다릅니다.

prototype에서 Ajax클래스 관련해서 사용한 부분에 다음과 같은 부분이 있습니다.

getTransport: function() {   return Try.these(     function() { return new XMLHttpRequest() },     function() { return new ActiveXObject('Msxml2.XMLHTTP') },     function() { return new ActiveXObject('Microsoft.XMLHTTP') }   ) || false;}


Try.these 함수의 인자로는 다수의 함수가 들어갑니다.

정확한 작동원리는 정상적인 객체를 반환하는 함수를 찾을때까지 에러를 발생시키지 않고 다음 함수를 실행합니다.

위의 예제는 크로스 브라우징을 위해 브라우저가 무엇인지를 판별하지 않고 적절한 객체가 반환될때까지 다른 함수를 수행합니다.

1번의 성공이 있으면 다음을 수행하지 않고 종료합니다.

undefined 혹은 null등의 값이 반환되면 다음의 함수를 수행합니다.

크로스 브라우징 등이나 피치못할 사정으로 이 방법이 잘 안되면 다른 방법을 사용하기 위해 사용할 수 있는 함수 입니다.

위의 예제에서는 3개의 함수가 모두 실패할 경우 false를 반환하는군요.

좋은 방법은 아니지만 혹시라도 정말 특이한 어쩌다 한번씩 발생하는 에러인데 잡을수가 없다면 이렇게 할 수 있겠죠.

Try.these(  function() {    // 원인을 알 수 없는 에러가 나는 부분  },  function() {    // 에러가 발생할 경우 이 함수로 대체  });

난 여기서 1,3,4,6 쓸꺼 같은데 새롭다.

'IT' 카테고리의 다른 글

Telnet 으로 port 확인  (2) 2009.03.18
JavaScript - OOP 와 prototype  (2) 2009.02.17
VS 단축키  (0) 2009.02.09
현재 컴퓨터에 설치된 디바이스 장치 정보 알아오기  (0) 2009.02.09
문자열 가지고 놀기~  (0) 2009.02.09

1.F12 : 함수 정의된 모듈로 이동

2.ctrl+shift+spacebar : 메소드 매개인자 보기

3.F9 중단점 지정.

4.F5 디버깅 모드로 실행.(이미 디버깅 모드로 실행중일때 F5를 누르면 다음 중단점까지 이동)

5.Ctrl+F5 디버깅하지 않고 실행.

6.F10 프로시저단위실행.(현재 행이 메소드 호출일 경우 메소드 전체를 실행하고 호출한 메소드의 다음 행으로 이동한다.)

7.F11 한 단계 실행.(현재 행이 메소드 호출일 경우 메소드 안에 있는 코드의 첫째 행으로 이동한다.)

8.Shift+F11 프로시저 나가기.

9.Ctrl+Shift+F9 모든 중단점 제거.

10.ctrl+shift+F5 : 디버깅 중일때 다시 시작.

11.ctrl+shift+B : 솔루션 빌드.

12.ctrl + F4 : 현재 문서 닫기 (열린 페이지가 너무 많아 버벅일 땐..닫아주어야 한다고 하네요..최소한의 작업 파일만 열어둘 것.)

13.ctrl + Tab : 내부 문서간 이동

 
<뷰어>

13.솔루션 탐색기 : Ctrl + Alt + L

14.클래스 탐색기 : Ctrl + Shift + C

15.속성창 : F4

16.출력창(빌드결과) : Ctrl + Alt + O (알파벳 오)

17.도구상자 : Ctrl + Alt + X

18.작업목록 창보기 : Ctrl + Alt + K

19.(aspx, ascx) 디자인 화면 : Shift + F7

20.(aspx, ascx) cs 소스 화면 : F7

21.(aspx, ascx) 디자인 Html 소스  :Ctrl + PageDown -> 위화면은 (aspx, ascx) 디자인 화면일때 가능

22.화면을 넓게쓰기(소스를 넓게보기): Alt + Shift + Enter -> 원래화면도 같음.

=> 위 3개창 어느것이나 창을 닫을려면 마우스 포커스가 있는 상태에서 Shift + ESC 를 누르면 됩니다.

 
<소그 편집 및 코딩시 >

23. 한 소스 안에서의 북마크
 
   북마크 찍기(해제) :  Ctrl  + K K

   북마크로 이동  :  Ctrl + K N

   북마크 전체 해제 :  Ctrl + K L
 

24. 여러 소스에서의 북마크

   북마크 찍기  :  Ctrl  + K H

   북마크 찍은 목록보기 :  

   1. Ctrl + Alt + K  누르면 작업목록 창이 나온다.

   2. 오른쪽 Ctrl 왼쪽에 있는 목록보기 버튼 클릭하면 리스트가 나온다.

   3. 이상태에서 K 누르고 S 누른다. (동시에 누르는거 아님)

   4. 그럼 바로가기 목록이 나오고 이목록이 북마크 목록이다.

   5. 방향키로 원하는 소스를 선택하면 해당소스 파일로 이동하고 그 위치에 커서가 간다.
 
25. 한줄 주석 : Ctrl + K C

26. 주석 해제 : Ctrl + K U

27. 여러줄 주석 : 쉬프트 누르고 방향키로 선택하고 Ctrl + K C

28. 여러줄 주석 해제: 쉬프트 누르고 방향키로 선택하고 Ctrl + K U

29. 소스 정사각형으로 선택하기: Alt + Shift + 방향키

 
<빌드 & 디버깅>

30. 빌드 : Ctrl + Shift + B

31. 디버깅 중단점 찍기 : Ctrl + F9

32. 디버깅 중단점 모두해제 : Ctrl + Shift + F9

33. 디버깅 중단점 모두 해제: Ctrl + Shift + B

34. 디버깅 : F5

35. 디버깅 중단 : Shift + F5

36. 디버깅 중에 다시 디버깅 : Ctrl + Shift + F5

37. 디버깅 중에 한칸씩 이동 : F11

38. 디버깅 중에 함수단위이동: F10

+ Recent posts