javascript/proJavaScript

객체지향 자바스트립트 2-3

우혁이 아빠 2009. 12. 14. 01:38

 

2-21 constructor 프로퍼티를 사용하는

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<script type="text/javascript">

//간단한 새 User 객체를 정의한다.

function User () {}

 

//새 User 객체를 만든다.

var me = new User();

 

//역시나 새 User 객체를 만든다.

//(첫 번째 User 객체의 constructor를 참조한다.)

var you = new me.constructor();

 

//실제로 constructor가 같음을 알 수 있다.

alert(me.constructor == you.constructor);

</script>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

 

</BODY>

</HTML>

 

2-22 prototype 객체를 통해 추가한 메서드를 갖는 객체의

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<script type="text/javascript">

//새 User 생성자를 만든다.

function User (name, age) {

this.name = name;

this.age = age;

}

 

//객체 프로토타입에 새 함수를 추가한다.

User.prototype.getName = function () {

return this.name;

}

 

//프로토타입에 또 다른 함수를 추가한다.

//콘텍스트는 생성될 객체 안에 존재한다.

User.prototype.getAge = function () {

return this.age;

}

 

//새 User 객체를 만든다.

var user = new User("Bob", 44);

 

//앞에서 추가한 두 메서드가 적절한 콘텍스트를

//갖고 객체에 들어 있음을 알 수 있다.

alert(user.getName() == "Bob");

alert(user.getAge() == 44);

</script>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

 

</BODY>

</HTML>

 

2-23 생성자 함수에서만 사용할 있는 private 메서드

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<script type="text/javascript">

//교실을 표현하는 객체 생성자

function Classroom (students, teacher) {

//수업을 듣는 모든 학생의 정보를 출력하는 private 메서드

function disp () {

alert(this.name.join(", "));

}

 

//수업 정보를 public 객체 프로퍼티에 저장한다.

this.students = students;

this.teacher = teacher;

 

//오류를 출력하기 위해 private 메서드를 호출한다.

disp();

}

 

//새로운 교실 객체를 만든다.

var class = new Classroom(["John", "Bob"], "Mr. Smith");

 

//disp는 이 객체의 public 프로퍼티가 아니기 때문에 실패한다.

class.disp();

</script>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

 

</BODY>

</HTML>

 

2-24 privileged 메서드를 사용하는

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<script type="text/javascript">

//새로운 User 객체 생성자를 만든다.

function User (name, age) {

//사용자가 태어난 날을 계산한다.

var year = (new Date()).getFullYear() - age;

 

//year 변수에 접근할 수 있으면서도 여전히 외부에서

//사용할 수 있는 privileged 메서드를 만든다.

this.getYearBorn = function () {

return year;

};

}

 

//User 객체의 새 인스턴스를 만든다.

var user = new User("Bob", 44);

 

//반환된 날짜가 올바른지 확인한다.

alert((new Date()).getFullYear()-44);

alert(user.getYearBorn() == 1962);

 

//객체의 private 프로퍼티인 year에는 접근할 수 없다.

alert(user.year == null);

</script>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

 

</BODY>

</HTML>

 

2-25 객체 인스턴스가 만들어질 동적으로 생성되는 메서드

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<script type="text/javascript">

//프로퍼티들을 나타내는 객체를 받는 새로운 User 객체를 만든다.

function User (properties) {

//객체 프로퍼트를 하나씩 방문하면서

//유효범위를 설정한다(앞에서 논의했듯이).

for ( var i in properties ) { (function () {

//이 프로퍼티를 위한 새 get 메서드를 만든다.

this[ "get" + i ] = function () {

return properties[i];

};

 

//이 프로퍼티를 위한 새 set 메서드를 만든다.

this[ "set" + i ] = function (val) {

properties[i] = val;

};

})(); }

}

 

//새로운 User 객체를 하나 생성하고

//초깃값으로 사용될 프로퍼티들을 나타내는 객체를 전달한다.

var user = new User ({

name: "Bob",

age: 44

});

 

//properties 객체 안에서 name 프로퍼티는 private이기 때문에

//외부에서 볼 때는 존재하지 않는다.

alert(user.name == null);

 

//그렇지만 동적으로 만들어지는 메서드인

//getname() 메서드에는 접근할 수 있다.

alert(user.getname() == "Bob");

 

//새로 만들어진 함수로

//age의 값을 설정하거나 가저올 수 있다.

user.setage(22);

alert(user.getage() == 22);

</script>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

 

</BODY>

</HTML>

 

2-26 static 메서드의 간단한

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<script type="text/javascript">

//User 객체에 붙어 있는 static 메서드

User.cloneUser = function (user) {

//새로운 사용자를 만들어 돌려준다.

return new User(

//전달받은 User 객체의 복사본

user.getName(),

user.getAge()

);

};

</script>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

 

</BODY>

</HTML>