캡슐화 하기 전의 코드면 이렇게 복붙+수정으로 끝날 수도 있지만 캡슐화까지 마친 코드라면 복붙+수정할 경우 줄이 길어지고 비효율적이므로 다음과 같이 상속 기법을 활용하자
1 2 3 4 5
functionSquare(length) { this.base = Rectangle; // base라는 속성에 생성자함수 넣어줌 this.base(length, length); // 함수가 된 base속성을 실행 } Square.prototype = Rectangle.prototype; // 프로토타입 복사
여기에서 Square.prototype.constructor() 메서드를 출력하면, 생성자함수 Square가 아니라 생성자함수 Rectangle을 가리킨다. 그대로 따왔기 때문이다. 그래서 Square.prototype의 생성자 함수를 Square(자기자신)으로 재정의해줘야 한다.
1 2 3
Square.prototype.constructor = Square; // 프로토타입 복사 후 재정의 var square = newSquare(5); alert(square instanceofRectangle);
만약 모든 상속과정이 잘 이루어 졌다면 true를 출력할것이다. 이는 객체 square가 생성자 함수 Rectangle로부터 만들어졌음을 의미하고, 생성자 함수 Square가 Rectangle의 상속을 받았음을 의미한다.
기본 내장 객체
기본 자료형과 객체의 차이점
기본 자료형 - 자바스크립트의 6가지 자료형 중 숫자, 문자열, 불
기본자료형으로 선언 var primitiveNumber = 273; 기본자료형이어서 속성이나 메서드가 없지만, 사용하려고하면 자동으로 객체로 변환이 되어 사용가능해짐 객체 자체는 아니기 때문에 속성과 메서드는 추가할 수 없음
생성자함수를 사용하여 객체로 선언 var objectNumber = new Number(273); 속성과 메서드를 프로토타입으로 추가할 수 있음
Object 객체
자바스크립트의 최상위 객체이자, Object 생성자 함수로 만든 인스턴스
자바스크립트의 모든 내장 객체는 Object 객체를 기본으로 만들어짐
Object객체의 속성,메서드는 모든 객체에서 사용 가능하고,
Object객체에 속성,메서드를 새로 추가하면 마찬가지로 모든 객체에서 사용 가능하다.
메서드
기능
constructor()
객체의 생성자 함수를 나타냄
hasOwnProperty(name)
객체가 name 속성이 있는지 확인
isPrototypeof(object)
객체가 object의 프로토타입인지 검사
propertyIsEnumerable(name)
반복문으로 열거할 수 있는지 확인
toLocaleString()
객체를 호스트 환경에 맞는 언어의 문자열로 바꿈
toString()
객체를 문자열로 바꿈
valueOf()
객체의 값을 나타냄
typeof 와 constructor() 자료형 구분
1 2 3 4 5 6
var A = 273; var B = newNumber(273); alert(typeof A); // number 출력 alert(typeof B); // object 출력 alert(A.constructor); // Number 출력 alert(B.constructor); // Number 출력
Number 객체
Object객체의 7가지 메서드에, 3가지 메서드를 추가로 가짐
메서드
기능
toExponential()
숫자를 지수 표시로 나타낸 문자열을 리턴
toFixed()
숫자를 고정 소수점 표시로 나타낸 문자열을 리턴
toPrecision()
숫자를 길이에 따라 지수 표시 또는 고정 소수점 표시로 나타낸 문자열을 리턴
속성
기능
MAX_VALUE
자바스크립트의 숫자가 나타낼 수 있는 최대 숫자
MIN_VALUE
자바스크립트의 숫자가 나타낼 수 있는 최소 숫자
NaN
자바스크립트의 숫자로 나타낼 수 없는 숫자
POSITIVE_INFINITY
양의 무한대 숫자
NEGATIVE_INFINITY
음의 무한대 숫자
1 2
var a = 123.12345; alert(a.toFixed(2)); // 123.12출력
String 객체
속성
기능
length
문자열의 길이 반환
메서드
기능
charAt(position)
position에 위치하는 문자를 리턴
charCodeAt(position)
position에 위치하는 문자의 유니코드 번호를 리턴
concat(args)
매개변수로 입력한 문자열을 이어서 리턴
indexOf(searchString, position)
앞에서부터 일치하는 문자열의 위치를 리턴
lastIndexOf(searchString, position)
뒤에서부터 일치하는 문자열의 위치를 리턴
match(regExp)
문자열 안에 regExp가 있는지 확인
replace(regExp, replacement)
regEXP를 replacement로 바꾼 뒤 리턴
search(regExp)
regExp와 일치하는 문자열의 위치를 리턴
slice(start, end)
특정 위치의 문자열을 추출해 리턴
split(separator, limit)
separator로 문자열을 잘라서 배열을 리턴
substr(start, count)
start부터 count만큼 문자열을 잘라서 리턴
substring(start, end)
start부터 end까지 문자열을 잘라서 리턴
toLowerCase()
문자열을 소문자로 바꾸어 리턴
toUpperCase()
문자열을 대문자로 바꾸어 리턴
HTML 관련 메서드
기능
anchor()
a 태그로 문자열을 감싸 리턴
big()
big 태그로 문자열을 감싸 리턴
blink()
blink 태그로 문자열을 감싸 리턴
bold()
b 태그로 문자열을 감싸 리턴
fixed()
tt 태그로 문자열을 감싸 리턴
fontcolor(colorString)
font 태그로 문자열을 감싸고 color 속성을 주어 리턴
fontsize(fontSize)
font 태그로 문자열을 감싸고 size 속성을 주어 리턴
italics()
i 태그로 문자열을 감싸 리턴
link(linkRef)
a태그에 href 속성을 지정해 리턴
small()
small 태그로 문자열을 감싸 리턴
strike()
strike 태그로 문자열을 감싸 리턴
sub()
sub 태그로 문자열을 감싸 리턴
sup()
sup 태그로 문자열을 감싸 리턴
기본적으로 String 객체의 메서드는 자기 자신을 변화시키지 않고 리턴한다. 그래서 “메서드 체이닝”이 가능하다 string으로 return된 값은 string의 메서드를 다 가져다 쓸 수 있고, 만약 number로 return 된다면 number의 메서드를 다 가져다 쓸 수 있을것이다.
1 2
var output = "Hello"; output = output.toLowerCase().substring(0, 10).anchor("name");
이런식으로 메서드 3개를 연속으로 사용할 수 있다.
Array 객체
만드는 방법
상세 기능
Array
생성자 함수
Array()
빈 배열을 만듬
Array(number)
매개변수만큼의 크기를 가지는 배열을 만듬
Array(any, … , any)
매개변수로 배열을 만듬
그래서 배열은 총 4가지 방법으로 만들 수 있음
1 2 3 4
var array1 = ["김", "용", "훈"]; var array2 = newArray(); var array3 = newArray(10); var array4 = newArray("김", "용", "훈");
속성
기능
length
배열의 요소의 개수를 리턴
메서드
기능
concat()
매개변수로 입력한 배열의 요소를 모두 합쳐 배열로 만들어 리턴
join()
배열안의 모든 요소를 문자열로 만들어 리턴
pop()
배열의 마지막 요소를 제거하고 리턴
push()
배열의 마지막 부분에 새로운 요소를 추가
reverse()
배열의 요소 순서를 뒤집음
slice()
요소의 지정한 부분을 리턴
sort()
배열의 요소를 정렬
splice()
요소의 지정한 부분을 삭제하고 삭제한 요소를 리턴
sort() 메서드 사용법 기본적으로 “매개변수 두개를 받는 함수”가 매개변수로 들어간다. javascript var array = [52, 273, 103, 32]; array.sort( function(left, right){} ); 매개변수로 입력한 함수가 리턴하는 숫자의 부호에 따라 정렬방식이 결정된다.
1 2 3 4 5 6 7 8
//오름차순 정렬 array.sort( function(left, right){ return left - right; }); //내림차순 정렬 array.sort( function(left, right){ return right - left; ;
1. 문자열을 사용 var date = newDate('December 9, 1991'); var date = newDate('December 9, 1991 02:24:23'); 2. 숫자를 사용 = 연, 월-1, 일, 시, 분, 초, 밀리 초 순서로 입력하고 싶은데 까지 입력 var date = newDate(1991, 11, 9); var date = newDate(1991, 11, 9, 2, 24, 23); 3.Unix time을 사용 var date = newDate(2732741033257);
메서드
get~으로 시작하는 메서드 20가지정도
set~으로 시작하는 메서드 20가지정도
to~~String인 메서드 20가지정도
날짜 간격 구하기
1 2 3 4
var now = newDate(); var before = newDate("January 22, 1994"); var interval = now.getTime() - before.getTime(); interval = Math.floor(interval / (1000 * 60 * 60 * 24)); // = 9120(일)
날짜 간격 구하는 메서드를 프로토타입으로 추가하기
1
Date.prototype.getInterval = ~~~~~~
Math 객체
속성
값
E
2.718281828459045
LN2
0.6931471805599453
LN10
2.302585092994046
LOG2E
1.4426950408889633
LOG10E
0.4342944819032518
PI
3.141592653589793
SQRT1_2
0.7071067811865476
SQRT2
1.4142135623730951
메서드
기능
random()
0부터 1까지의 임의의 수를 리턴
max(a,b,c,…,z)
가장 큰 값 리턴
min(a,b,c,…,z)
가장 작은 값 리턴
pow(x,y)
x의 y제곱
sqrt(x)
x의 제곱근을 리턴
abs(x)
x의 절댓값을 리턴
round(x)
x를 반올림하여 리턴
floor(x)
x보다 작거나 같은 가장 큰 정수를 리턴
celi(x)
x보다 크거나 같은 가장 작은 정수를 리턴
exp(x)
자연로그의 x 제곱을 리턴
log(x)
x의 로그값을 리턴
sin(x)
x의 사인 값을 리턴
asin(x)
x의 아크 사인 값을 리턴
cos(x)
x의 코사인 값을 리턴
acos(x)
x의 아크 코사인 값을 리턴
tan(x)
x의 탄젠트 값을 리턴
atan(x)
x의 아크 탄젠트 값을 리턴
atan2(y,x)
x와 y의 비율로 아크 탄젠트 값을 구해 리턴
ECMAScript5 Array 객체
메서드
기능
isArray()
매개변수가 배열인지 확인
indexOf()
매개변수를 배열의 앞쪽부터 검색, 위치를 리턴(없으면 -1 리턴)
lastIndexOf()
매개변수를 배열의 뒤쪽부터 검색, 위치를 리턴(없으면 -1 리턴)
forEach()
배열 각각의 요소를 사용해 특정 함수를 for in 반복문처럼 실행
map()
기존의 배열에 특정 규칙을 적용해 새로운 배열을 만듬
filter()
특정 조건을 만족하는 요소를 추출해 새로운 배열을 만듬
every()
배열의 요소가 특정 조건을 모두 만족하는지 확인
some()
배열의 요소가 특정 조건을 적어도 하나 만족하는지 확인
reduce()
배열의 요소가 하나가 될 때까지 요소를 왼쪽부터 두 개씩 묶는 함수를 실행
reduceRight()
배열의 요소가 하나가 될 때까지 요소를 오른쪽부터 두 개씩 묶는 함수를 실행
indexOf() 메서드 예시
1 2 3 4 5
var array = {1,2,3,4,5,5,4,3,2,1}; var output1 = array.indexOf(4); // = 4 var output2 = array.indexOf(10); // = -1 var output3 = array.lastIndexOf(4); // = 6 var output4 = array.lastIndexOf(10); // = -1
forEach() 메서드 예시
매개변수로 함수가 들어감
1 2 3 4 5 6 7
var array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; var sum = 0; var output = ''; array.forEach( function(element, index, array){ sum += element; output += index + ': ' + element + ' -> ' + sum + '\n'; });
map() 메서드 예시
매개변수로 함수가 들어감
1 2 3 4
var array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; var output = array.map(function (element) { return element \* element; }); // 배열이 제곱수로 바뀜 1,4,9, ...
filter() 메서드 예시
매개변수로 함수가 들어감
1 2 3 4
var array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; array = array.filter(function(element, index, array){ return element <= 5; // 불 자료형으로 리턴함 }); // 트루로 리턴된것만 골라 배열 형성
every() 메서드와 some() 메서드 예시
매개변수로 함수가 들어감
1 2 3 4 5 6
var array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; functionlessThanFive(element, index, array){ return element < 5; // 불 자료형으로 리턴함 } var output1 = array.every(lessThanFive); // false반환 var output2 = array.some(lessThanFive); // true반환
reduce() 메서드와 reduceRight() 메서드 예시
매개변수로 함수가 들어감
1 2 3 4 5
var array = {1,2,3,4,5}; var output = ""; array.reduce(function(previousValue, currentValue, index, array){ output += previousValue + ":" +currentValue + ":" + index + \n; });
var child = window.open("", "", "width=300, height=200"); var width = screen.width; var height = screen.height; child.moveTo(0, 0); child.resizeTo(width, height);
Audio 객체
속성
값
src
음악 파일의 경로
volume
소리 크기
currentTime
현재 위치(초 단위)
메서드
기능
play()
재생
pause()
일시 정지
객체 생성
1 2 3 4
var audio = newAudio("music/kalimba.mp3"); //아니면 생성자 함수에서 src를 지정 안하고 별도로 지정해도 됨 var audio = newAudio(); audio.src = "music/kalimba.mp3";
간단한 재생 프로그램
1 2 3 4 5 6 7 8 9
<script> var audio = newAudio("music/kalimba.mp3"); </script> <body> <buttononclick="audio.play()">재생</button> <buttononclick="audio.pause()">일시정지</button> <inputtype="number"onchange="audio.currentTime=this.value" /> //재생 위치 <inputtype="number"onchange="audio.volume=this.value" /> //볼륨 </body>
모바일 장치 구분
2가지 방법이 있음 : 서버에서 확인 or 클라이언트에서 확인 2가지 방법 모두 userAgent이용
1 2
var userAgent = navigator.userAgent; alert(userAgent);
userAgent속성에 브라우저를 구분할 수 있는 고유한 문자열이 있음 iPhone, iPod, iPad, Android, WebOS 등등 또 카톡, 페북에서 링크를 클릭하면 KAKAOTALK등의 문자열이 있음 스마트폰 구분 코드
1 2 3 4 5 6 7
var smartPhones = ["iphone", "ipod", "android"]; for (var i in smartPhones) { if (navigator.userAgent.toLowerCase().match(newRegExp(smartPhones[i]))) { alert("모바일 페이지로 전환합니다"); location = "http://m.hanbit.co.kr"; } }
이 구조를 문서객체 모델이라고 함 각각은 노드라고 함, “”는 텍스트 노드, 나머지는 요소 노드
1 2 3
window.onload = function () { var header = document.getElementById("header"); };
==> 객체 header를 문서객체라고 함(정적으로 생성된 문서 객체)
정적으로 문서 객체 생성 HTML페이지에 적혀있는 태그를 읽으며 생성
동적으로 문서 객체 생성 자바스크립트로 원래 HTML페이지에 없던 문서객체를 생성
document 객체의 노드 생성
메서드
기능
createElement(tagName)
요소노드를 생성
createTextNode(text)
텍스트 노드를 생성
문서 객체의 노드 연결
메서드
기능
appendChild(node)
객체에 노드를 연결
1 2 3 4 5 6 7 8
window.onload = function () { var header = document.createElement("h1"); //<h1>태그 생성 var textNode = document.createTextNode("Hello DOM"); //"Hello DOM"문자열 생성
스타일시트에 사용하던 스타일 속성 이름을 그대로 사용하면 안됨 (자바스크립트는 -를 식별자에 사용할 수 없으므로 -다음 첫 글자를 대문자로) font-family background-color: X fontFamily backgroundColor: O 대신 문자열로 스타일 속성에 접근할 때는 두가지 방법 모두 가능
onload : 이벤트 속성(실제로 on으로 시작하는 모든 html의 속성은 이벤트 속성)
이벤트 속성에 할당된 함수 : 이벤트 리스너 or 이벤트 핸들러
이벤트를 연결하는 방법 = 이벤트 모델
DOM Level 0
인라인 이벤트 모델
기본(고전) 이벤트 모델
DOM Level 2
마이크로소프트 인터넷 익스플로러 이벤트 모델
표준 이벤트 모델
level0은 방법이 쉽지만 이벤트를 중복해서 연결 불가
level2는 이벤트를 중복해서 연결할 수 있지만 브라우저 종류에 따라 방법이 다름 ==> 이 단점들은 jquery를 통해 모두 커버 가능!
DOM LEVEL0 - 기본(고전) 이벤트 모델
1 2 3
var image = document.getElementById("image"); image.width = 100; image.height = 100;
HTML 표준에 속한 태그의 속성은 모두 이렇게 사용할 수 있다. 이벤트 속성도 속성의 일종이므로 역시 마찬가지다. 대신에 이벤트 속성에는 함수를 지정하는 것이다. 이때 지정됨 함수 = 이벤트 핸들러 = 이벤트 리스너 단, 이벤트 하나에 이벤트 리스너 하나만 연결할 수 있음
1 2 3 4 5 6 7 8 9 10 11
<script> window.onload = function () { var header = document.getElementById("kyh"); header.onclick = function () { alert("클릭됨"); }; }; </script> <body> <h1id="kyh">Click</h1> </body>
이벤트를 일회성으로 하고 싶다면 이벤트 리스너를 null로 바꾸면 됨 다음 코드에서 함수는 한번 실행되고 소실됨
1 2 3 4 5 6 7
window.onload = function () { var header = document.getElementById("kyh"); header.onclick = function () { alert("클릭됨"); header.onclick = null; }; };
이벤트 발생 객체(<->이벤트 객체)
이벤트를 누가 발생시켰는지, 그 객체를 의미함 이벤트 리스너 안에서 this 키워드를 사용해서 확인
1 2 3 4 5 6 7 8 9 10
<script> window.onload = function () { document.getElementById("kyh").onclick = function () { alert(this); }; }; </script> <body> <h1id="kyh">Click</h1> </body>
==> object HTMLHeadingElement 출력(이벤트가 발생한 문서 객체 kyh) 그래서 이벤트 리스너 안에서 this키워드의 스타일을 바꾸는 것은 이벤트가 발생한 객체의 스타일을 바꾸는 것
1 2 3 4 5 6
window.onload = function () { document.getElementById("kyh").onclick = function () { this.style.color = "orange"; this.style.backgroundColor = "red"; }; };
==>h1의 글씨와 배경이 주황+빨강으로 바뀜
이벤트 객체
이벤트의 ‘누가’와 관련된 정보외의 다른 정보가 있음
1 2 3 4 5 6 7 8 9 10 11 12 13
window.onload = function () { document.getElementById("header").onclick = function (e) { //IE8 이하는 인터넷 익스플로러 이벤트 모델이라는 독자적인 이벤트 모델 사용하기 때문에 이벤트 객체를 window.event속성으로 사용 //나머지 브라우저는 이벤트 객체로 이벤트 리스너의 매개변수로 사용 //IE9 이상은 이벤트 객체로 둘 다 사용 가능 var event = e || window.event;
<script> window.onload = function () { document.getElementById("header").onclick = function () { alert("header"); }; document.getElementById("paragraph").onclick = function () { alert("paragraph"); }; }; </script> <body> <h1id="head"> <pid="paragraph">Paragraph</p> </h1> </body>
-> 이벤트 버블링에 의하여 paragraph -> header 순으로 경고창 출력
이벤트 버블링 막기 인터넷 브라우저 : 이벤트 객체의 cancelBubble속성을 true로 변경 타 브라우저 : 이벤트 객체의 stopPropagation()메서드 사용
1 2 3 4 5 6 7 8 9 10 11
document.getElementById("paragraph").onclick = function (e) { //이벤트 객체 처리 var event = e || window.event; //이벤트 발생 알림 alert("paragraph"); //이벤트 전달을 제거 event.cancelBubble = true; if (event.stopPropagation) { event.stopPropagation(); } };
-> 인터넷 익스플로러는 이벤트 객체에 stopPropagation() 메서드가 없어서 조건문으로 에러 방지 그 외 브라우저도 cancleBubble속성에 값만 넣는 거라 가능할 뿐 속성을 사용하려면 문제가 생길 수 있음
try { alert("이 부분은 일단 실행됨"); notExist.noExist(); // 없는 객체의 없는 메서드 실행 = 에러 -> catch로 점프 alert("이 부분은 점프 되서 실행 안됨"); } catch (exception) { alert("에러가 잡혔을 경우 이 부분 실행"); } finally { alert("어찌 되었든 이 부분은 결국 실행됨"); }
예외 객체
catch의 괄호안에 입력하는 식별자 (exception, e로 쓰임) 타 언어에 비해 활용하는 경우가 적음
속성
값
message
예외 메시지
description
예외 설명
name
예외 이름
1 2 3 4 5 6 7 8 9
try { var array = newArray(999999999999); //배열의 크기는 한정되어 있으므로 예외 발생시킴 } catch (exception) { var output = ""; for (var i in exception) { output += i + ":" + exception[i] + "\n"; } alert(output); }
출력 내용
1 2 3 4
description : 배열의 길이는 유한한 정수이어야 합니다. number : -2146823259 stack : RangeError : 배열의 길이는 유한한 양의 정수이어야 합니다. at Global code (http://localhost:56926/HTMLPage1.html:1:26)
에러와 예외
예외 : try-catch 구문으로 해결할 수 있음 에러 : try-catch 구문으로 해결할 수 없음(문법 오류 같은 것) 에러의 예시