[TIL] 220112

dev·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
dev log

0ę°œė˜ 댓ęļ€