• Prototype (프로토타입)

    TypeScript 는 객체지향 언어이지만 JavaScript 도 ProtoType을 활용하면 객체지향 언어라 할 수 있다. 또한 ES6 에서는 Class 를 사용할 수도 있다.

    TypeScript 에서 사용되는 Class나 Interface 를 컴파일러를 이용해서 JavaScript 로 변환하면 결국 다 Prototype 으로 변환이 된다. 그래서 JavaScript 에서 Prototype은 굉장히 근본적인 것이라 볼 수 있는데, 이런 Prototype은 상속을 위해서 사용이 되어진다.

    TypeScript 에서는 Class 에 extends를 통해 상속을 하였다면 JavaScript 에서는 Prototype을 통해 상속을 구현할 수 있다. (재사용 = 상속)

    const x = {};
    console.log(x);
    /**
      -> __proto__: Object
        =>
        -> constructor: ƒ Object()
        -> hasOwnProperty: ƒ hasOwnProperty()
        -> isPrototypeOf: ƒ isPrototypeOf()
        -> propertyIsEnumerable: ƒ propertyIsEnumerable()
        -> toLocaleString: ƒ toLocaleString()
        -> toString: ƒ toString()
        -> valueOf: ƒ valueOf()
        -> __defineGetter__: ƒ __defineGetter__()
        -> __defineSetter__: ƒ __defineSetter__()
        -> __lookupGetter__: ƒ __lookupGetter__()
        -> __lookupSetter__: ƒ __lookupSetter__()
        -> get __proto__: ƒ __proto__()
        -> set __proto__: ƒ __proto__()
     */
    

    → x 는 객체로 Object 객체를 상속하고 있다. ( proto: Object )

    const array = [];
    console.log(array);
    /**
      -> __proto__: Array(0)
        =>
        -> concat: ƒ concat()
        -> constructor: ƒ Array()
        -> copyWithin: ƒ copyWithin()
        -> entries: ƒ entries()
        -> every: ƒ every()
        -> fill: ƒ fill()
        -> filter: ƒ filter()
        -> find: ƒ find()
        -> findIndex: ƒ findIndex()
        -> flat: ƒ flat()
        -> flatMap: ƒ flatMap()
        -> forEach: ƒ forEach()
        -> includes: ƒ includes()
        -> indexOf: ƒ indexOf()
        -> join: ƒ join()
        -> keys: ƒ keys()
        -> lastIndexOf: ƒ lastIndexOf()
        -> length: 0
        -> map: ƒ map()
        -> pop: ƒ pop()
        -> push: ƒ push()
        -> reduce: ƒ reduce()
        -> reduceRight: ƒ reduceRight()
        -> reverse: ƒ reverse()
        -> shift: ƒ shift()
        -> slice: ƒ slice()
        -> some: ƒ some()
        -> sort: ƒ sort()
        -> splice: ƒ splice()
        -> toLocaleString: ƒ toLocaleString()
        -> toString: ƒ toString()
        -> unshift: ƒ unshift()
        -> values: ƒ values()
        -> Symbol(Symbol.iterator): ƒ values()
        -> Symbol(Symbol.unscopables): {copyWithin: true, entries: true, fill: true, find: true, findIndex: true, …}
        -> __proto__: Object
          =>
          -> constructor: ƒ Object()
          -> hasOwnProperty: ƒ hasOwnProperty()
          -> isPrototypeOf: ƒ isPrototypeOf()
          -> propertyIsEnumerable: ƒ propertyIsEnumerable()
          -> toLocaleString: ƒ toLocaleString()
          -> toString: ƒ toString()
          -> valueOf: ƒ valueOf()
          -> __defineGetter__: ƒ __defineGetter__()
          -> __defineSetter__: ƒ __defineSetter__()
          -> __lookupGetter__: ƒ __lookupGetter__()
          -> __lookupSetter__: ƒ __lookupSetter__()
          -> get __proto__: ƒ __proto__()
          -> set __proto__: ƒ __proto__()
     */
    

    → array 는 Array객체를 상속하고 있으며, Array객체는 Object 객체를 상속하고 있다.

    (=프로토타입 체이닝)