[TIL] 220112

Lee Syong·2022년 1ė›” 12ėž
0

TIL

ëŠĐ록 ëģīęļ°
147/204
post-thumbnail

📝 ė˜Ī늘 한 ęēƒ

  1. íī래ėŠĪ

📚 ë°°ėšī ęēƒ

7. íī래ėŠĪ

1) íī래ėŠĪė™€ ėļėŠĪí„īėŠĪė˜ 개념 ėīí•ī

íī래ėŠĪ는 ęģĩí†ĩ ėš”ė†ŒëĨž ė§€ë‹ˆëŠ” ė§‘ë‹Ļė„ ëķ„ëĨ˜í•˜ęļ° ėœ„í•œ 개념ėīë‹Ī.
ES5ęđŒė§€ė˜ ėžë°”ėŠĪ큎ëĶ―íŠļė—ëŠ” íī래ėŠĪ가 ė—†ęģ , ES6ė—ė„œ íī래ėŠĪ가 도ėž…되ė—ˆë‹Ī.
íī래ėŠĪ는 하ėœ„ëĄœ 갈ėˆ˜ëĄ ėƒėœ„ íī래ėŠĪė˜ ė†ė„ąė„ ėƒė†í•˜ëĐīė„œ 더 ęĩŽėēīė ėļ ėš”ęąīėī ėķ”ę°€ 또는 ëģ€ęē―된ë‹Ī. (ėƒėœ„ íī래ėŠĪ / 하ėœ„ íī래ėŠĪ)
한íŽļ, ėļėŠĪí„īėŠĪ란 ė–īë–Ī íī래ėŠĪė˜ ė†ė„ąė„ ė§€ë‹ˆëŠ” ė‹ĪėĄī하는 개ėēīëĨž 말한ë‹Ī.
프로ę·ļ래밍 ė–ļė–īė—ė„œëŠ” íī래ėŠĪ가 ëĻžė € ė •ė˜ë˜ė–īė•žë§Œ ę·ļ로ëķ€í„° ęģĩí†ĩė ėļ ėš”ė†ŒëĨž ė§€ë‹ˆëŠ” 개ėēī(ėļėŠĪí„īėŠĪ)ë“Īė„ ėƒė„ąí•  ėˆ˜ ėžˆë‹Ī.

2) ėžë°”ėŠĪ큎ëĶ―íŠļė˜ íī래ėŠĪ

var Rectangle = function (name) {
  this.width = width;
  this.height = height;
};

Rectangle.prototype.getArea = function () {
  return this.width * this.height;
};

Rectangle.isRectangle = function (instance) {
  return instance instanceOf Rectangle && instance.width > 0 && instance.height > 0;
};

var rect1 = new Rectangle(3, 4);
console.log(rect1.getArea()); // 12
console.log(rect1.isRectangle(rect1)); // Uncaught TypeError: not a function
console.log(Rectangle.isRectangle(rect1)); // true

프로토타ėž… ëДė„œë“œëŠ” íī래ėŠĪė˜ prototype ë‚īëķ€ė— ė •ė˜ëœ ëДė„œë“œëĄœė„œ ėļėŠĪí„īėŠĪ가 마ėđ˜ ėžė‹ ė˜ ęēƒėē˜ëŸž í˜ļėķœí•  ėˆ˜ ėžˆë‹Ī.
ėŠĪ태틱 ëДė„œë“œëŠ” íī래ėŠĪ(ėƒė„ąėž í•Ļėˆ˜)ė— ė§ė ‘ ė •ė˜í•œ ëДė„œë“œëĄœė„œ ėļėŠĪí„īėŠĪ가 ė§ė ‘ í˜ļėķœí•  ėˆ˜ ė—†ęģ  íī래ėŠĪ(ėƒė„ąėž í•Ļėˆ˜)ė— ė˜í•īė„œë§Œ í˜ļėķœí•  ėˆ˜ ėžˆë‹Ī.

ęĩŽėēīė ėļ ėļėŠĪí„īėŠĪ가 ė‚ŽėšĐ할 ëДė„œë“œëĨž ė •ė˜í•œ '틀'ė˜ ė—­í• ė„ 할 때ė˜ íī래ėŠĪ는 ėķ”ėƒė ėļ 개념ėīë‹Ī.
ę·ļ럮나, ėŠĪ태틱 ëДė„œë“œëĨž í˜ļėķœí•  때ė˜ íī래ėŠĪ는 íī래ėŠĪ(ėƒė„ąėž í•Ļėˆ˜) ėžėēī가 this가 되ė–ī ëДė„œë“œė— ė§ė ‘ ė ‘ę·ží•˜ëŊ€ëĄœ 하나ė˜ ęĩŽėēīė ėļ 개ėēī로ė„œ ė·Ļęļ‰ëœë‹Ī.

3) íī래ėŠĪ ėƒė†

(1) ęļ°ëģļ ęĩŽí˜„

ë‹ĪėĪ‘ 프로토타ėž… ėēīėļė„ ėīėšĐí•ī íī래ėŠĪ ėƒė†ė„ ęĩŽí˜„í•  ėˆ˜ ėžˆë‹Ī.
ėžë°”ėŠĪ큎ëĶ―íŠļė—ė„œ íī래ėŠĪ ėƒė†ė„ ęĩŽí˜„í–ˆë‹Ī는 ęēƒė€ ęģ§ 프로토타ėž… ėēīėī닝ė„ ėž˜ ė—°ęē°í–ˆë‹Ī는 ëœŧėīë‹Ī.
ė•žė„œ ė°ļęģ í–ˆë˜ ė˜ˆė œëĨž ë‹Īė‹œ 가ė ļė™”ë‹Ī.

ė˜ˆė œ 1: Array ë‚īėžĨ íī래ėŠĪëĨž ėƒė†í•˜ëŠ” 하ėœ„ íī래ėŠĪ

var Grade = function () {
  var args = Array.prototype.slice.call(arguments);
  for (var i = 0; i < args.length; i++) {
    this[i] = args[i];
  }
  this.length = args.length;
};

Grade.prototype = [];
var g = new Grade(100, 80);
console.log(g); // // Grade { 0: 100, 1: 80, length: 2 }

delete g.length; // gė—ė„œ length 프로퍾티가 ė‚­ė œëœë‹Ī
g.push(70); // gė˜ length 값ėœžëĄœ g.__proto__.length(ėĶ‰, Grade.prototype.length)ė˜ 값(0)ė„ ė―ė–īė˜Ļ 후 gė— 70ė„ push 한ë‹Ī
console.log(g); // Grade { 0: 70, 1: 80, length: 1 }

ę·ļ럮나 ėœ„ ė˜ˆė œ ė―”ë“œė—ëŠ” 멇 가ė§€ 큰 ëŽļė œę°€ ėžˆë‹Ī.

  • length 프로퍾티가 configurable(ė‚­ė œ 가ëŠĨ)하ë‹Ī.
  • Grade.prototypeė— ëđˆ ë°°ė—īė„ ė°ļėĄ°ė‹œėž°ë‹Ī. ( = 하ėœ„ íī래ėŠĪ가 ęĩŽėēīė ėļ 데ėī터ëĨž 가ė§„ë‹Ī.)

ë‚īėžĨ 객ėēīėļ ë°°ė—ī ėļėŠĪí„īėŠĪė˜ length 프로퍾티는 ė‚­ė œę°€ ëķˆę°€ëŠĨ한 반ëĐī, Grade íī래ėŠĪė˜ ėļėŠĪí„īėŠĪ는 Grade.prototype = []ė— ė˜í•ī ë°°ė—ī ëДė„œë“œëĨž ėƒė†í•˜ëĐīė„œë„, ęļ°ëģļė ėœžëĄœëŠ” ėžë°˜ 객ėēīė˜ ė„ąė§ˆė„ ę·ļ대로 ė§€ë‹ˆëŊ€ëĄœ length 프로퍾티ëĨž ė‚­ė œí•  ėˆ˜ ėžˆë‹Ī.

ėīė™€ 같ė€ ė˜ĪëĨ˜ëĨž ė ‘하ė§€ ė•Šęļ° ėœ„í•īė„œëŠ” íī래ėŠĪė— ėžˆëŠ” 값ėī ėļėŠĪí„īėŠĪė˜ 동ėž‘ė— ė˜í–Ĩė„ ėĢžė§€ ė•ŠęēŒë” íī래ėŠĪ가 ęĩŽėēīė ėļ 데ėī터ëĨž ė§€ë‹ˆė§€ ė•Šë„록 í•īė•ž 한ë‹Ī.

ė˜ˆė œ 2: ė‚ŽėšĐėžę°€ ė •ė˜í•œ 두 íī래ėŠĪ ė‚Žėīė˜ ėƒė† ęī€ęģ„

// ė§ė‚Žę°í˜• íī래ėŠĪ & ė •ė‚Žę°í˜• íī래ėŠĪ
var Rectangle = function (width, height) {
  this.width = width;
  this.height = height;
};

Rectangle.prototype.getArea = function () {
  return this.width * this.height;
};

var rect = new Rectangle(3, 4);
console.log(rect.getArea()); // 12

var Square = function (width) {
  Rectangle.call(this, width, width);
};

Square.prototype = new Rectangle(); // 하ėœ„ íī래ėŠĪė˜ prototypeė— ė—°ęē°í•˜ęģ ėž 하는 ėƒėœ„ íī래ėŠĪ(ėƒė„ąėž í•Ļėˆ˜)ė˜ ėļėŠĪí„īėŠĪ 할ë‹đ

var sq = new Square(5);
console.log(sq.getArea()); // 25

console.dir(sq)ė„ ė‹Ī행í•ī sq ėļėŠĪí„īėŠĪëĨž ė‚īíŽīëģīëĐī íī래ėŠĪ가 ęĩŽėēīė ėļ 데ėī터ëĨž 가ė§€ęģ  ėžˆėŒė„ 확ėļ할 ėˆ˜ ėžˆë‹Ī.

Square
  height: 5
  width: 5
  __proto__: Rectangle // íī래ėŠĪ가
    height: undefined // undefined 띾는 값ė„ 가ė§„ë‹Ī
    width: undefined // undefined 띾는 값ė„ 가ė§„ë‹Ī
    __proto__ :
      getArea: f ()
      constructor: f (width, height)
      __proto__: Object

또한, sq ėļėŠĪí„īėŠĪė˜ constructor가 Square가 ė•„니띞 Rectangleė„ ė°ļėĄ°í•œë‹Ī는 ëŽļė œė ė„ 가ė§„ë‹Ī.

var rect2 = sq.constructor(2, 3);
console.log(rect2); // Rectangle { width: 2, height: 3 }

ė •ëĶŽí•˜ėžëĐī, 하ėœ„ íī래ėŠĪ로 ė‚žė„ ėƒė„ąėž í•Ļėˆ˜ė˜ prototypeė— ėƒėœ„ íī래ėŠĪė˜ ėļėŠĪí„īėŠĪëĨž ëķ€ė—Ží•ĻėœžëĄœėĻ(ë‹ĪėĪ‘ 프로토타ėž… ėēīėļ) ęļ°ëģļė ėļ ëДė„œë“œ ėƒė†ė€ 가ëŠĨ하ė§€ë§Œ ë‹Īė–‘í•œ ëŽļė œę°€ 발ėƒí•  ė—Žė§€ę°€ ėžˆë‹Īęģ  할 ėˆ˜ ėžˆë‹Ī.

(2) íī래ėŠĪ가 ęĩŽėēīė ėļ 데ėī터ëĨž ė§€ë‹ˆė§€ ė•ŠęēŒ 하는 ë°Đëē•

íī래ėŠĪ ėƒė† 및 ėķ”ėƒí™”ëĨž ėœ„í•īė„œëŠ” SubClass.prototype.__proto__가 SuperClass.prototypeė„ ė°ļėĄ°í•˜ęģ , SubClass.prototypeė—ëŠ” ëķˆí•„ėš”í•œ ėļėŠĪí„īėŠĪ 프로퍾티(ęĩŽėēīė ėļ 데ėī터)가 ë‚Ļė§€ ė•Šë„록 í•īė•ž 한ë‹Ī.

ë°Đëē• 1: ėļėŠĪí„īėŠĪ ėƒė„ą 후 프로퍾티 ė œęą°

ėƒėœ„ íī래ėŠĪė˜ ėļėŠĪí„īėŠĪ(하ėœ„ íī래ėŠĪė˜ prototype 객ėēī)ëĨž 만든 후 하ėœ„ íī래ėŠĪ가 ęĩŽėēīė ėļ 데ėī터ëĨž ė§€ë‹ˆė§€ ė•Šë„록 ę·ļ 프로퍾티ëĨž ė œęą°í•œë‹Ī.
ėī후로 ëģ€ęē― í˜đė€ ė‚­ė œí•  ėˆ˜ ė—†ë„록 Object.freeze()ëĨž ė‚ŽėšĐ한ë‹Ī.

delete Square.prototype.width;
delete Square.prototype.height;
Object.freeze(Square.prototype);

ë°Đëē• 2: ëđˆ í•Ļėˆ˜ 활ėšĐ

var Bridge = function () {}; // ëđˆ ėƒė„ąėž í•Ļėˆ˜
Bridge.prototype = Rectangle.prototype;
Square.prototype = new Bridge();
Object.freeze(Square.prototype);

ë°Đëē• 3: Object.create() 활ėšĐ

하ėœ„ íī래ėŠĪė˜ prototypeė˜ __proto__가, ėƒėœ„ íī래ėŠĪė˜ prototypeė„ ė°ļėĄ°í•˜ë˜, (하ėœ„ íī래ėŠĪ가 ęĩŽėēīė ėļ 데ėī터ëĨž ė§€ë‹ˆė§€ ė•Šë„록) ėƒėœ„ íī래ėŠĪė˜ ėļėŠĪí„īėŠĪ가 되ė§€ëŠ” ė•Šë„록 한ë‹Ī.

...
Square.prototype = Object.create(Rectangle.prototype);
Object.freeze(Square.prototype);
...

(3) constructor ëģĩęĩŽí•˜ęļ°

ėœ„ė—ė„œ ė‚īíŽīëīĪë“Ŋėī SubClass.prototype.constructor가 SuperClassëĨž 가ė§€ęģ  ėžˆė–īė„œ SubClass.constructorëĨž ė‹Ī행하ëĐī ė˜ë„ė™€ ë‹ĪëĨļ ęē°ęģžę°€ 나ė˜Ļë‹Ī.
íī래ėŠĪ ėƒė† 및 ėķ”ėƒí™”ëĨž ėœ„í•ī ėķ”ę°€ė ėœžëĄœ SubClass.prototype.constructor가 SubClassëĨž ė°ļėĄ°í•˜ë„록 í•īė•ž 한ë‹Ī.
ëē”ėšĐė„ąė„ ęģ ë Ī한 ė―”ë“œė— ė•„래 ė―”ë“œëĨž ėķ”ę°€í•˜ë„ëĄ 한ë‹Ī.

SubClass.prototype.constructor = SubClass;

4) ES6ė˜ íī래ėŠĪ 및 íī래ėŠĪ ėƒė†

var Rectangle = class {
  constructor (width, height) {
    this.width = width;
    this.height = height;
  }
  getArea () {
    return this.width * this.height
  }
};

var Square = class extends Rectangle {
  constructor (width) {
    super(width, width);
  }
  getArea () {
    console.log("size is : ", super.getArea());
  }
};

ėƒėœ„ íī래ėŠĪëĨž ėƒė†ë°›ëŠ” 하ėœ„ íī래ėŠĪëĨž 만ë“Īęļ° ėœ„í•ī class 멅ë đė–ī ë’Īė— 'extends ėƒėœ„ íī래ėŠĪ ėīëĶ„'ė„ ėķ”ę°€í–ˆë‹Ī.

constructor ëДė„œë“œ ë‚īëķ€ė—ė„œ super í‚Īė›Œë“œëĨž 'í•Ļėˆ˜'ėē˜ëŸž ė‚ŽėšĐ할 ėˆ˜ ėžˆëŠ”데, ėī는 ėƒėœ„ íī래ėŠĪė˜ constructor(ėƒė„ąėž í•Ļėˆ˜)ëĨž ė‹Ī행한ë‹Ī.

constructor ëДė„œë“œëĨž ė œė™ļ한 ë‹ĪëĨļ ëДė„œë“œė—ė„œëŠ” super í‚Īė›Œë“œëĨž '객ėēī'ėē˜ëŸž ė‚ŽėšĐ할 ėˆ˜ ėžˆë‹Ī.
ėī때 객ėēī는 ėƒėœ„ íī래ėŠĪė˜ prototype 객ėēīëĨž ė°ļėĄ°í•œë‹Ī.
ę·ļ럮나, í˜ļėķœí•  ëДė„œë“œ ë‚īëķ€ė—ė„œė˜ this는 ė›ëž˜ė˜ this(ėĶ‰, 하ėœ„ íī래ėŠĪė˜ prototype 객ėēī)ëĨž ę·ļ대로 따ëĨļë‹Ī.


âœĻ ë‚īėž 할 ęēƒ

  1. ëģĩėŠĩ 및 ė •ëĶŽ
profile
ëŠĨ동ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0개ė˜ 댓ęļ€