[문법] 자바스크립트 객체 : 내장 객체, 사용자 정의 객체, 프로토타입
자바스크립트 객체
1. 내장 객체, 사용자 정의 객체
※ 내장 객체는 생성자 함수가 미리 정의되어(작성되어) 있으며,
사용자 정의 객체는 사용자가 이 생성자 함수를 정의하는 것이다.
2. 사용자 정의 객체
1.객체와 연관된 데이터는 객체가 생성될 때 초기화 되어야 한다 → 생성자라고 부르는 특별한 함수가 객체를 활성화 시키는 데 필요하다.
2.생성자로 객체를 생성하기 위해서는 자바와 마찬가지로 『new』 연산자를 활용하게 된다.
3.생성자(객체)의 이름은 첫 글자를 대문자로 표기한다.
4.생성자 내부에 속성, 함수를 생성하기(정의하기) 위해 『this』 키워드를 사용한다.
5.객체의 멤버인 속성과 함수는 『.(dot)』 연산자로 접근한다.
6.사용자 정의 객체를 만드는 기본 형식 및 구조 (생성자를 구성하는 기본 형식 및 구조)
function 생성자명(인자리스트) ← 생성자명의 첫 글자... 대문자
{
// 속성 정의
this.멤버명 = 인자;
// 메소드(함수) 정의
this.멤버명 = function(인자리스트)
{
// 메소드(함수) 내부 코드
return 리턴값;
};
}
7.프로토타입 : 한 객체가 가지고 있는 속성과 메소드(함수)를 다른 객체(혹은 여러 다른 객체)가 공유할 수 있도록 지원하는 개념
ex) function Car(x, y)
{
this.x=x;
this.y=y;
this.getDistance = function()
{
return (this.x * this.x + this.y * this.y);
};
}
이 코드가 자동차(Car)를 나타내는 객체라고 가정한다.
여기서 『getDistance()』는 원래 위치부터 이동 거리를 계산하는 함수라고 가정한다.
여러 개의 자동차를 사용하는 경우
var c1 = new Car(10, 20);
var c2 = new Car(10, 50);
:
var c100 = new Car(10,42);
이와 같은 구문들을 활용하여 객체를 생성했다면...
객체들마다 『getDistance()』 함수를 가지게 되면서 메모리를 낭비하게 된다.
이 때... 객체들마다 함수를 가지는 것이 아니라 하나의 함수를 만들어 공유하기 위해 프로토타입을 정의하게 된다.
※ 모든 객체는 프로토타입이라는 숨겨진 객체를 포함하고 있다.
『Car』 객체의 프로토타입은 『Car.prototype』이라는 숨겨진 객체를 갖고 있다는 것이다.
function Car(x, y)
{
this.x=x;
this.y=y;
}
Car.prototype.getDistance = function()
{
return (this.x * this.x + this.y * this.y);
};
var c3 = new Car(10, 80);
c3.getDistance();
사용자 정의 객체(생성자)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test036.html</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
th {text-align: left;}
</style>
<script type="text/javascript">
function objTest()
{
// 확인
//alert("함수 호출");
// 사용자 정의 객체(생성자) 정의
function Blog(b, d)
{
// 객체를 구성하는 속성
this.body=b;
this.date=d;
}
// this가 가리키는 것은 선언하고 있는 객체 자체이다. → Blog(b,d)
// 객체 생성
var blog = new Blog("블로그 개설", "2022-01-14");
// new 예약어는 새로운 객체를 만들 때 사용한다.
// 생성된 객체의 속성(멤버) 접근
var str = blog.body + " / " + blog.date;
// 확인
//alert(str);
/*
var ob1 = new Blog("블로그 개설", "2022-01-14");
var ob2 = new Blog("블로그 레이아웃 구성", "2022-02-10");
var ob3 = new Blog("생성자 이용한 객체 생성", "2022-02-16");
var arr = [ob1, ob2, ob3];
*/
// 위와 같은 구문
// 사용자 정의 객체 여러 개를 배열 구조에 저장
var arr = [ new Blog("블로그 개설", "2022-01-14")
, new Blog("블로그 레이아웃 구성", "2022-02-10")
, new Blog("생성자 이용한 객체 생성", "2022-02-16") ];
str = "<table border='1' class='table'>";
str += "<tr><th>제목</th><th>날짜</th></tr>";
// 변수에 테이블 태그 넣을 수 있구나!
for (var i = 0; i < arr.length; i++)
{
str += "<tr>";
str += "<td>" + arr[i].body + "</td>";
str += "<td>" + arr[i].date + "</td>";
str += "</tr>";
}
str + "</table>";
var result = document.getElementById("result");
result.innerHTML = str;
}
</script>
</head>
<body>
<div>
<h1>자바스크립트 활용</h1>
<hr>
</div>
<div>
<h2>자바스크립트 객체(사용자 정의 객체)</h2>
<div> <!-- 속성 이름, 값 띄어쓰기 가급적 X -->
<input type="button" value="사용자 정의 객체 테스트" class="btn control" onclick="objTest()">
<br><br>
<div id="result"></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test037.html</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<script type="text/javascript">
function objTest()
{
// 확인
//alert("확인");
// 사용자 정의 객체
// Test036.html 에서와 마찬가지로 사용자 정의 객체 구성
// 단, 차이점 확인~!!! check~!!!
function Blog(b, d)
{
// 주요 속성 구성
this.body=b;
this.date=d;
// 날짜 출력용 함수 정의
this.userLocalString = function() // 내부 함수 정의하는 형태 check~!!!
{
return d.getFullYear() + "-" + (d.getMonth()+1) + "-" + d.getDate();
};
// 자바스크립트 내장 객체 이용해서 함수 생성
// userLocalString이라는 변수에 함수 생성?
}
// 객체 생성
var blog = new Blog("블로그 개설", "2022-01-14");
var str = blog.body + " / " + blog.date;
// 확인
//alert(str);
// Test036.html 에서와 마찬가지로
// 사용자 정의 객체 여러 개를 자바스크립트 배열 구조에 저장.
// 단, 차이점 확인~!!!
// → 자바스크립트 내장 객체 활용
var arr = [new Blog("블로그 개설", new Date("2022/01/14"))
, new Blog("블로그 레이아웃 구성", new Date("2022/02/10"))
, new Blog("생성자 이용한 객체 생성", new Date("2022/02/16")) ];
/*
○ 자바스크립트에서의 날짜 데이터
Date 객체는 날짜와 시간 작업을 하는 데 사용되는
가장 기본적인 자바스크립트 내장 객체이다.
var now = new Date();
now.toString();
now.toLocaleString();
now.toLocaleDateString();
now.toLocaleTimeString();
now.getFullYear();
now.getMonth()+1; //-- check!!! (월 단위는 자바에서처럼 0부터 시작한다.)
now.getDate();
※ 주의
var userDate1 = new Date("2022/04/08"); // ○
var userDate2 = new Date(2022, 04, 08); // ○
var userDate3 = new Date(Apr, 8, 2022); // ○
var userDate3 = new Date("2022-04-08"); // Ⅹ
var userDate3 = new Date("20220408"); // Ⅹ
*/
str = "<table border='1' class='table'>";
str += "<tr>";
str += "<th>제목</th><th>날짜</th>";
str += "</tr>"
// check~!!!
/*
for (var i = 0; i < arr.length; i++)
{
str += "<tr>";
str += "<td>" + arr[i].body + "</td>";
str += "<td>" + arr[i].date + "</td>";
str += "</tr>";
}
*/
// check~!!!
for (var i = 0; i < arr.length; i++)
{
str += "<tr>";
str += "<td>" + arr[i].body + "</td>";
str += "<td>" + arr[i].userLocalString() + "</td>";
str += "</tr>";
}
str += "</table>";
var result = document.getElementById("result");
result.innerHTML = str;
}
</script>
</head>
<body>
<div>
<h1>자바스크립트 활용</h1>
<hr>
</div>
<div>
<h2>자바스크립트 객체(사용자 정의 객체)</h2>
<div> <!-- 속성 이름, 값 띄어쓰기 가급적 X -->
<input type="button" value="사용자 정의 객체 테스트" class="btn control" onclick="objTest()">
<br><br>
<div id="result"></div>
</div>
</div>
</body>
</html>