자바와는 다르게 자바스크립트에서는 클래스의 기능이 없다.
대신 객체 리터럴이나 생성자 함수로 객체를 생성하는데, 이렇게 생성된 객체의 부모 객체가 '프로토타입 객체'다.
상속 개념과 마찬가지로 자식 객체는 부모 객체가 가진 프로퍼티 접근이나 메서드를 상속받아 호출하는 것이 가능하다.
<생성규칙>
자바스크립트에서 모든 객체는 자신을 생성한 생성자 함수의 prototype 프로퍼티가 가리키는 프로토타입 객체를 자신의 부모 객체로 설정하는 [[Prototype]]링크로 연결한다.
// Person 생성자 함수
function Person(name) {
this.name = name;
}
// foo 객체 생성
var foo = new Person('foo');
console.dir(Person);
console.dir(foo);
특정 객체의 프로퍼티나 메서드에 접근하려고 할 때, 해당 객체에 접근하려는 프로퍼티 또는 메서드가 없다면 [[Prototype]]링크를 따라 자신의 부모 역할을 하는 프로토타입 객체의 프로퍼티를 차례대로 검색하는 것을 '프로토타입 체이닝'이라고 합니다.
var myObject = {
name: 'foo',
sayName: function() {
console.log('My Name is ' + this.name);
}
};
myObject.sayName(); // (출력값) My Name is foo
console.log(myObject.hasOwnProperty('name')); // (출력값) true
console.log(myObejct.hasOwnProperty('nickName')); // (출력값) false
myObject.sayNickName(); // Uncaught TypeError: Object #<Object> has no method 'sayNickName'
생성자 함수로 객체 리터럴 방식과 약간 다른 프로토 타입 체이닝이 이뤄집니다.
그러나, “객체가 자신을 생성한 생성자 함수의 prototype 프로퍼티가 가리키는 객체를 자신의 프로토타입 객체(부모 객체)로 취급한다” 라는 기본 원칙은 잘 지켜집니다.
// Person() 생성자 함수
function Person(name, age, hobby) {
this.name = name;
this.age = age;
this.hobby = hobby;
}
// foo 객체 생성
var foo = new Person(‘foo’, 30, ‘tennis’);
// 프로토타입 체이닝
console.log(foo.hasOwnProperty(‘name’));
// Person.prototype 객체 출력
console.log(Person.prototype);
프로토타입 체이닝의 종점은 Object.prototype 이다.
Object.protytpe에는 hasOwnProperty() 나 isPrototypeOf() 등과 같이 모든 객체가 호출 가능한 표준 메서드들이 정의되어 있습니다.
기본 데이터 (숫자, 문자열, 배열 등)에서 사용되는 표준 메서드들의 경우 이들의 프로토타입인 Number.prototype, String.prototype, Array.prototype 등에 정의되어 있다. 이들 역시 최상위 Object.prototype을 자신의 프로토타입으로 가지고있어서 프로토타입 체이닝으로 연결된다.
String.prototype.testMethod = function() {
console.log(‘This is the String.prototype.testMethod()’);
}
var str = “this is test”;
str.testMethod(); // (출력값) ‘This is the String.prototype.testMethod()
console.dir(String.prototype);