UX Engineer 이명종

자바스크립트 코어 - 프로토타입

자바스크립트 코어 - 프로토타입

목차

프로토타입의 개념

var instance = new Constructor();
var Person = function(name) {
  this.name = name;
};
Person.prototype.getName = function() {
  return this.name;
};

var gildong = new Person('Gildong');
gildong.getName();  // Gildong
                    // __proto__ 는 생략이 가능함
gildong.__proto__.getName(); // undefined
                             // 함수를 메서드로서 호출했기 때문에 바로 앞의 객체가 this가 됨 
                             // __proto__ 객체에는 name 프로퍼티가 없기때문에 undefined 출력
Person.prototype === gildong.__proto__ // true

내장 생성자 함수 Array 예시

  var arr = [1, 2];
  console.dir(arr);
  console.dir(Array);

  Array.isArray(arr);  // true
  arr.isArray();  // TypeError: arr.isArray is not a function

constructor 프로퍼티

var arr = [1, 2];
Array.prototype.constructor === Array  // true
arr.__proto__constructor === Array  // true
arr.constructor === Array  // true

var arr2 = new arr.constructor(3, 4);
console.log(arr2)  // [3, 4]
var newConstructor = function () {
  console.log('this is new constructor!');
};

var dataTypes = [
  1,  // Number & false
  'test',  // String & false
  true,  // Boolean & false
  {},  // newConstructor & false
  new Number(),  // newConstructor & false
  new String(), // newConstructor & false
  new Boolean(), // newConstructor & false
  new Object(), // newConstructor & false
  new Array() // newConstructor & false
]; 

dataTypes.forEach(function (data) {
  data.constructor = newConstructor;
  console.log(data.constructor.name, '&', data instanceof newConstructor)
});

프로토타입 체인

메서드 오버라이드

var Person = function (name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name
};

var gildong = new Person('Gildong');

gildong.getName = function () {
  return '나는 ' + this.name;
};

console.log(gildong.getName());  // 나는 Gildong

/**
 * 자바스크립트 엔진이 getName 메서드를 찾을때 가장 가까운 대상인 자신의 프로퍼티를 검색하고 없으면 그 다음 대상인 __proto__를 찾음 그래서 undefined가 출력됨
*/

console.log(gildong.__proto__.getName());  // undefined

// call이나 apply 메서드를 이용하여 this 바인딩을 인스턴스를 바라보게 바꿔 줄 수 있음
console.log(gildong.__proto__.getName.call(gildong)); // Gildong

프로토타입 체인

var arr = [1, 2, 3];
arr.push(4);  // [1, 2, 3, 4]
arr.hasOwnProperty(1);  // true

프로토타입 체인 : 어떤 데이터의 __proto__ 프로퍼티 내부에 다시 __proto__ 프로퍼티가 연쇄적으로 이어진 것
프로토타입 체이닝 : 프로토타입 체인을 따라가며 검색하는 것

객체 전용 메서드의 예외사항

Static Method

  • 클래스의 constructor(생성자)에 접근하지 않고 바로 static method를 실행하기 때문에 클래스를 생성하지 않고 클래스 내부에 바로 접근하여 실행이 가능
  • constructor(생성자)에 선언된 변수, 객체 등 어떤 자료도 접근할 수 없다
  • 자세한 정보는 여기 클릭

다중 프로토타입 체인

let Grade = function() {
  let args = Array.prototype.slice.call(arguments);
  for(let i = 0; i < args.length; i++) {
    this[i] = args[i];
  }
  this.length = args.length;
};
let g = new Grade(100, 80);
  Grade.prototype = [];

  let g = new Grade(100, 80);
  console.log(g);  // Grade(2) [100, 80]
  g.pop()
  console.log(g);  // Grade [100]
  g.push(90)
  console.log(g) // Grade(2) [100, 90]

요약


Share this: