function Person(name, age) {
this.name = name; // public
let _age = age; // private
// 인스턴스 메서드
this.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
}
const me = new Person('Yoo', 25);
me.sayHi(); // Hi! My name is Yoo. I am 25.
console.log(me.name); // Yoo
console.log(me._age); // undefined
const you = new Person('Kim', 20);
you.sayHi(); // Hi! My name is Kim. I am 20.
console.log(you.name); // Kim
console.log(you._age); // undefined
name 프로퍼티는 public으로 자유롭게 참조하거나 변경할 수 있지만, _age 변수는 Person 생성자 함수의 지역 변수이므로 Person생성자 외부에서 참조하거나 변경할 수 없는 private이다.
function Person(name, age) {
this.name = name; // public
let _age = age; // private
}
// 프로토타입 메서드
Person.prototype.sayHi = function () {
// Person 생성자 함수의 지역 변수 _age를 참조할 수 없다
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
지역 변수 _age가 private로 선언되어있어 외부에서 참조하지 못하지는 문제가 발생한다.
(function (){
var a = 2;
var b = 5;
return a*b;
}());
const Person = (function () {
let _age = 0; // private
// 생성자 함수
function Person(name, age) {
this.name = name; // public
_age = age;
}
// 프로토타입 메서드
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
// 생성자 함수를 반환
return Person;
}());
const me = new Person('Yoo', 25);
me.sayHi(); // Hi! My name is Yoo. I am 25.
console.log(me.name); // Yoo
console.log(me._age); // undefined
const you = new Person('Kim', 20);
you.sayHi(); // Hi! My name is Kim. I am 20.
console.log(you.name); // Kim
console.log(you._age); // undefined
즉시 실행 함수가 반환하는 Person 생성자 함수와 Person 생성자 함수의 인스턴스가 상속받아 호출할 Person.prototype.sayHi 메서드는 즉시 실행 함수가 끝나고 호출됨
- Person 생성ㅈㅏ 함수가 여러 개의 인스턴스를 생성할 경우, _age변수의 상태가 유지되지않음
const me = new Person('Yoo', 25);
me.sayHi(); // Hi! My name is Yoo. I am 25.
const you = new Person('Kim', 20);
you.sayHi(); // Hi! My name is Kim. I am 20.
// _age 변수 값이 변경됨
me.sayHi(); // Hi! My name is Kim. I am 20.
프로토타입 메서드가 단 한번 생성되는 클로저이기 때문에 이런 현상이 발생