1 오브젝트의 프로퍼티의 값을 불변하게 해보자
2 오브젝트의 숨은 프로퍼티에 대해 알아보자
3 프로토타입
4 OOP를 프로토타입으로 하는것, 클래스로 하는것 다른가?
5 this를 알아보자

JS OOP를 프로토타입으로 하는것, 클래스로 하는것 다른가?

bGV0IGxpc3QgPSBuZXcgQXJyYXkoKTsKLy8g7J2066CH6rKMIEFycmF5IOyDneyEseyekO2VqOyImOulvCDsnbTsmqntlbTshJwg67Cw7Je06rCd7LK066W8IOunjOuTpCDsiJgg7J6I64ukCgpjbGFzcyBFcnJheSB7Cgp9Ci8vIOydtOugh+qyjCDsg53shLHsnpDtlajsiJjrnbzripTqsbgg64K06rCAIOyngeygkSDrp4zrk6TsiJjrj4Qg7J6I64ukCgpjb25zb2xlLmxvZyh0eXBlb2YgRXJyYXkpCi8vIO2VqOyImOudvOqzoCDtlZzri6QKCmxldCBlcnJheSA9IG5ldyBFcnJheSgpOwpjb25zb2xlLmxvZyhlcnJheS5jb25zdHJ1Y3Rvcik7Ci8vIOydtOugh+qyjCDrgrTqsIAg66eM65OgIOyDneyEseyekO2VqOyImOuhnCDqsJ3ssrTrpbwg66eM65Ok7Ja07IScIGNvbnN0cnVjdG9yIOulvCDtmZXsnbjtlbTrs7jri6QKLy8g6re465+s66m0IEVycmF5IOulvCDqsIDrpqztgqjri6QKCmNvbnNvbGUubG9nKGVycmF5LmNvbnN0cnVjdG9yID09PSBFcnJheSk7Ci8vIOydtOugh+qyjCDqsJnsnYzsnYQg7ZmV7J247ZW067O8IOyImCDsnojri6QKCmNvbnNvbGUubG9nKE9iamVjdC5nZXRQcm90b3R5cGVPZihlcnJheSkuY29uc3RydWN0b3IgPT09IEVycmF5KTsKLy8g66eI7LCs6rCA7KeA66GcIOydtOugh+qyjOuPhCDtmZXsnbjsnbQg6rCA64ql7ZWY64ukCgpjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXJyYXkpKQovLyDtlITroZzthqDtg4DsnoXsnZgg66qo7Iq164+EIO2ZleyduO2VtOuztOyekAovLyDtmZXsnbjqsrDqs7wgY29uc3RydWN0b3Ig7ZWY64KYIOuLrOuekSDsnojri6QKCkVycmF5LnByb3RvdHlwZS5uZXdvbmUgPSAxMjM7Ci8vIOydtOugh+qyjCDqsJLsnYQg64Sj7Ja07KSA7ZuECgpjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXJyYXkpKQovLyDri6Tsi5wg7ZmV7J247ZW067O07J6QCi8vIG5ld29uZeydtCDrk6TslrTqsIDsnojsnYzsnbQg7ZmV7J2465Cc64ukCgpjb25zb2xlLmxvZyhlcnJheS5uZXdvbmUpCi8vIOq3uOuemOyEnCDsnbTroIfqsowg7KCR6re87J20IOqwgOuKpe2VmOuLpAoKY29uc29sZS5sb2coZXJyYXkuaGFzT3duUHJvcGVydHkoJ25ld29uZScpKTsKLy8g7ZWY7KeA66eMIG5ld29uZeydgCBlcnJheeydmCDsho3shLHsnbjqsoPsnYAg7JWE64uI6528IGZhbHNl6rCAIOuCmOyYqOuLpAovLyDqt7jrn7DrjbAg7J6g6rmQLi4gZXJyYXkuaGFzT3duUHJvcGVydHkg64qUIOyZnCDrkJjripTqsbjquYw/IOyDneqwge2VtOuztOyekAoKY29uc29sZS5sb2coT2JqZWN0LmdldFByb3RvdHlwZU9mKGVycmF5KSkKLy8g67aE66qFIOyXrOq4sOyXkOuKlCBuZXdvbmUsIGNvbnN0cnVjdG9y66eMIOyeiOydhOu/kOydtOqzoCBlcnJheeydmCDsnpDssrTsho3shLHsl5Drj4QgaGFzT3duUHJvcGVydHnqsIAg7JeG64ukCgpjb25zb2xlLmxvZyhlcnJheVsnaGFzT3duUHJvcGVydHknXSkKLy8g7ZW067O066m0IOuCmOyYqOuLpAoKLy8g7J6QIOq3uCDsnbTsnKDripQg64uk7J2M6rO8IOqwmeuLpApjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXJyYXkpKQovLyDsnbzri6ggZXJyYXnsnZgg7ZSE66Gc7Yag7YOA7J6F7J2EIO2ZleyduO2VmOqzoOyekCDtlZzri6TrqbQg7JWE656Y7JmAIOqwmeydtCDtlZjrqbQg7ZSE66Gc7Yag7YOA7J6F7J2EIOuzvCDsiJgg7J6I64ukCgpjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVycmF5KSkpCi8vIOq3uOufsOuNsCDsnbTqsoPsnZgg7ZSE66Gc7Yag7YOA7J6F7J2EIOuYkCDrs7TsnpAKLy8g7Jes6riw7JeQIGhhc093blByb3BlcnR5IOqwgCDsnojripTqsoPsnbQg7ZmV7J2465Cc64ukCgpjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihlcnJheSkpKSkKLy8g65iQIOyUjOyasOuptD8g7J207KCc64qUIG51bGzsnbQg64KY7Jio64ukCgpjbGFzcyBCcnJheSB7CiAgIG5hbWUgPSAnaGVsbG8nCiAgIHN0YXRpYyB0eXBlID0gJ0hlbGxvJwp9CmxldCBicnJheSA9IG5ldyBCcnJheSgpOwpjb25zb2xlLmxvZyhicnJheS5uYW1lKQpjb25zb2xlLmxvZyhicnJheS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKQovLyDsnbTrn7Ag66qo7Iq17J2YIOyDneyEseyekOulvCDrp4zrk6TslrTshJwg6rCd7LK066W8IOunjOuTpOyWtOuztOyekAovLyBicnJheS5uYW1lIOqwkuydtCDsnpgg7ZmV7J2465Cc64ukCi8vIGJycmF5Lmhhc093blByb3BlcnR5IOuhnCBuYW1lIOydhCDtmZXsnbjtlbTrtJDrj4QgdHJ1ZeuhnOyNqCDsho3shLHsnbQg7KG07J6s7ZWo7J20IO2ZleyduOuQnOuLpAovLyBzdGF0aWPtgqTsm4zrk5zrpbwg67aZ7J24IOyGjeyEseyduCB0eXBl7J2AIGJycmF56rCd7LK07JmA64qUIOyghO2YgCDsg4HqtIDsl4bripQg7JqU7IaM6rCAIOuQnOuLpC4KCmNvbnNvbGUubG9nKEJycmF5LnR5cGUpOwpjb25zb2xlLmxvZyhCcnJheS5oYXNPd25Qcm9wZXJ0eSgndHlwZScpKTsKY29uc29sZS5sb2coT2JqZWN0LmtleXMoQnJyYXkpKTsKY29uc29sZS5sb2coT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihCcnJheSwgJ3R5cGUnKSkKLy8g7J206rKD7JeQIOygkeq3vO2VmOuKlCDrsKnrspXsnYAgQnJyYXkudHlwZeydtOuLpAovLyBCcnJheS5oYXNPd25Qcm9wZXJ0eSDroZwg7ZmV7J247ZaI7J2E65WMIHRydWXroZzsjaggdHlwZeydgCBCcnJheeydmCDqsJ3ssrTsl5Ag7Y+s7ZWo65CcIOyGjeyEseycvOuhnCDtmZXsnbjrkJjqs6AKLy8gT2JqZWN0LmtleXMg66Gc64+EIO2ZleyduOuQnOuLpC4gT2JqZWN0LmtleXProZwg7ZmV7J2465Cc64uk64qUIOqyg+ydgCBlbnVtZXJhYmxl7J20IHRydWXrnbzripQg65y77J206rOgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3LroZwg7KCV66eQIOq3uOufsOyngCDtmZXsnbjtlbTrs7jqsrDqs7wKLy8g66ee64qU6rKD7Jy866GcIO2ZleyduOuQnOuLpAoKLy8g7KaJIHN0YXRpY+2CpOybjOuTnOulvCDrtpnsnbjqsoPsnYAKQnJyYXkudHlwZTIgPSAnV29ybGQnCi8vIOydtOufsOyLneycvOuhnCDstpTqsIDrkJzqsoPqs7wg6rCZ64uk6rOgIOuzvCDsiJgg7J6I64ukCgoKY2xhc3MgQ3JyYXkgZXh0ZW5kcyBBcnJheSB7Cn0KbGV0IGNycmF5ID0gbmV3IENycmF5KCk7CmNvbnNvbGUubG9nKGNycmF5Wydmb3JFYWNoJ10pOwovLyBBcnJheeulvCDsg4Hsho3rsJvripQgQ3JyYXnrpbwg66eM65Ok7Ja067O07J6QCi8vIOq3uOumrOqzoCBmb3JFYWNoIOyGjeyEseydhCDtmZXsnbjtlbTrs7gg6rKw6rO8IOygkeq3vOydtCDqsIDriqXtlZjri6QKLy8g7J2864uoIGZvckVhY2jripQgY3JyYXnsnZgg7KeB7KCR7KCBIOyGjeyEseycvOuhnCDsobTsnqztlZjripTqsoPsnYAg7JWE64uI64ukCgpjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3JyYXkpID09PSBDcnJheS5wcm90b3R5cGUpCmNvbnNvbGUubG9nKE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3JyYXkpKSA9PT0gQXJyYXkucHJvdG90eXBlKQpjb25zb2xlLmxvZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihjcnJheSkpKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkKLy8g7JyE7JmAIOqwmeydgCDrsKnrspXsnLzroZwg7ZmV7J247ZW067O066m0IOuqqOuRkCB0cnVl6rCAIOuCmOyYpOuKlOqyg+ydhCDtmZXsnbjtlaAg7IiYIOyeiOuLpAovLyBleHRlbmRzIO2VnOuLpOuKlOqyg+ydgCBwcm90b3R5cGXsnbQg7Jew6rKw65CY6rKMIOuQqOydhCDtmZXsnbjtlaAg7IiYIOyeiOuLpAovLyBBcnJheeuYkO2VnCBleHRlbmRzIE9iamVjdOulvCDtlZjqs6DsnojripQg66qo7Iq17Jy866GcIO2ZleyduOuQnOuLpAovLyDqt7jroIfquLAg65WM66y47JeQIE9iamVjdC5wcm90b3R5cGUg7JeQIOyeiOuKlCDrqqjrk6Ag7ZWo7IiY64qUIGNycmF5IOulvCDthrXtlbTshJzrj4QgW10g66W8IO2Gte2VtOyEnOuPhCDsoJHqt7zsnbQg6rCA64ql7ZWc6rKD7J2064ukCgpjb25zb2xlLmxvZyhjcnJheS5oYXNPd25Qcm9wZXJ0eSk7CmNvbnNvbGUubG9nKFtdLmhhc093blByb3BlcnR5KTsKY29uc29sZS5sb2coY3JyYXkuaGFzT3duUHJvcGVydHkgPT09IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpOwovLyDsnbTroIfqsozrp5DsnbTri6QKCmNsYXNzIERycmF5IHsKICAgbmFtZSA9ICdkZCcKICAgbWV0aG9kKCkgewogICAgICByZXR1cm4gJ2hlbGxvJzsKICAgfQp9CmxldCBkcnJheSA9IG5ldyBEcnJheSgpOwpjb25zb2xlLmxvZyhkcnJheS5tZXRob2QoKSkKLy8g7JyE7JmAIOqwmeydtCBtZXRob2Qg66mU7IaM65Oc66W8IOunjOuTpOyWtOuztOyekAovLyDqt7jrpqzqs6Ag7J206rKD7J2AIGRycmF5Lm1ldGhvZCgpIOydtOufsOyLneycvOuhnCDsoJHqt7zsnbQg6rCA64ql7ZWY64ukCgpjb25zb2xlLmxvZyhkcnJheS5oYXNPd25Qcm9wZXJ0eSgnbWV0aG9kJykpOwpjb25zb2xlLmxvZyhPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkcnJheSkpCi8vIOydtCBtZXRob2TrnoAg6rKD7J20IGRycmF5IOqwneyytOydmCDsho3shLHsnLzroZwg65Ok7Ja06rCA7J6I7J2E7KeAIO2ZleyduO2VtOu0pOuLpC4gaGFzT3duUHJvcGVydHnroZzripQgZmFsc2XqsIAg64KY7Jio64ukCi8vIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIOuhnOuKlCBuYW1l66eMIO2ZleyduOuQnOuLpC4KLy8gbWV0aG9k64qUIOyWtOuUlOyXkCDsnojripTqsbjquYwKLy8g7ZSE66Gc7Yag7YOA7J6F7J2EIO2ZleyduO2VtOuztOyekAoKY29uc29sZS5sb2coT2JqZWN0LmdldFByb3RvdHlwZU9mKGRycmF5KSkKLy8g7Jes6riw7JeQIOuTpOyWtOqwgOyeiOydjOydtCDtmZXsnbjrkJzri6QKCi8vIOymiQpEcnJheS5wcm90b3R5cGUubWV0aG9kMiA9IGZ1bmN0aW9uIG1ldGhvZDIoKSB7IHJldHVybiAnaGVsbG8yJzsgfQpjb25zb2xlLmxvZyhkcnJheS5tZXRob2QyKCkpCi8vIO2VtOyEnCDrp4zrk6DqsoPqs7wg67mE7Iq37ZWY64uk64qUIOydmOuvuOqwgCDrkJzri6QuCi8vIOydtOugh+qyjCBtZXRob2QyIOulvCDstpTqsIDtlZwg7ZuEIHByb3RvdHlwZeydhCDtmZXsnbjtlbTrs7TsnpAKCmNvbnNvbGUubG9nKE9iamVjdC5nZXRQcm90b3R5cGVPZihkcnJheSkpCi8vIOyekCDsnbTroIfqsowg7ZmV7J247ZW067O07J6QCi8vIG1ldGhvZCwgbWV0aG9kMiwgY29uc3RydWN0b3LqsIAg7ZmV7J2465CY64qU642wIOyXrOq4sOyEnCBtZXRob2Qy66eMIGVudW1lcmFibGXsnbQgdHJ1ZeuhnCDrs7Tsnbjri6QuCi8vIOygleunkCDqt7jrn7Dsp4Ag7ZmV7J247ZW067O07J6QCgpjb25zb2xlLmxvZyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKERycmF5LnByb3RvdHlwZSwgJ21ldGhvZCcpKQpjb25zb2xlLmxvZyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKERycmF5LnByb3RvdHlwZSwgJ21ldGhvZDInKSkKY29uc29sZS5sb2coT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihEcnJheS5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicpKQovLyDtmZXsnbgg6rKw6rO8IG1ldGhvZDLsnZggZW51bWVyYWJsZeydgCB0cnVl7J6E7J20IO2ZleyduOuQnOuLpAoKT2JqZWN0LmRlZmluZVByb3BlcnR5KERycmF5LnByb3RvdHlwZSwgJ21ldGhvZDMnLCB7CiAgIHZhbHVlOiBmdW5jdGlvbiBtZXRob2QzKCkgeyByZXR1cm4gJ2hlbGxvMyc7IH0sCiAgIGVudW1lcmFibGU6IGZhbHNlLAogICBjb25maWd1cmFibGU6IHRydWUsCiAgIHdyaXRhYmxlOiB0cnVlLAp9KTsKY29uc29sZS5sb2coT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihEcnJheS5wcm90b3R5cGUsICdtZXRob2QnKSkKY29uc29sZS5sb2coT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihEcnJheS5wcm90b3R5cGUsICdtZXRob2QyJykpCmNvbnNvbGUubG9nKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRHJyYXkucHJvdG90eXBlLCAnbWV0aG9kMycpKQpjb25zb2xlLmxvZyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKERycmF5LnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJykpCi8vIOychOyZgCDqsJnsnbQg7LaU6rCA66W8IO2VmOuptCDrqqjsirXsnbQg6rCZ7JWE7KeA64qUIOqyg+ydhCDtmZXsnbgg7ZWgIOyImCDsnojri6QKLy8g7LC46rOg66GcIGVudW1lcmFibGUsIGNvbmZpZ3VyYWJsZSwgd3JpdGFibGUg6rCS7J2EIOyngOygleydhCDslYjtlbTso7zrqbQg6riw67O47J2AIGZhbHNl7J2064ukCi8vIOq3uOufrOuvgOuhnCDsnIQg7IOB7Zmp7JeQ7IScIGVudW1lcmFibGXripQgZmFsc2XroZwg7ZWg6rKD7J20652866m0IOyViOyNqOykmOuPhCDsg4HqtIDsl4bsl4jri6Q=
let list = new Array(); // 이렇게 Array 생성자함수를 이용해서 배열객체를 만들 수 있다 class Erray { } // 이렇게 생성자함수라는걸 내가 직접 만들수도 있다 console.log(typeof Erray) // 함수라고 한다 let erray = new Erray(); console.log(erray.constructor); // 이렇게 내가 만든 생성자함수로 객체를 만들어서 constructor 를 확인해본다 // 그러면 Erray 를 가리킨다 console.log(erray.constructor === Erray); // 이렇게 같음을 확인해볼 수 있다 console.log(Object.getPrototypeOf(erray).constructor === Erray); // 마찬가지로 이렇게도 확인이 가능하다 console.log(Object.getPrototypeOf(erray)) // 프로토타입의 모습도 확인해보자 // 확인결과 constructor 하나 달랑 있다 Erray.prototype.newone = 123; // 이렇게 값을 넣어준후 console.log(Object.getPrototypeOf(erray)) // 다시 확인해보자 // newone이 들어가있음이 확인된다 console.log(erray.newone) // 그래서 이렇게 접근이 가능하다 console.log(erray.hasOwnProperty('newone')); // 하지만 newone은 erray의 속성인것은 아니라 false가 나온다 // 그런데 잠깐.. erray.hasOwnProperty 는 왜 되는걸까? 생각해보자 console.log(Object.getPrototypeOf(erray)) // 분명 여기에는 newone, constructor만 있을뿐이고 erray의 자체속성에도 hasOwnProperty가 없다 console.log(erray['hasOwnProperty']) // 해보면 나온다 // 자 그 이유는 다음과 같다 console.log(Object.getPrototypeOf(erray)) // 일단 erray의 프로토타입을 확인하고자 한다면 아래와 같이 하면 프로토타입을 볼 수 있다 console.log(Object.getPrototypeOf(Object.getPrototypeOf(erray))) // 그런데 이것의 프로토타입을 또 보자 // 여기에 hasOwnProperty 가 있는것이 확인된다 console.log(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(erray)))) // 또 씌우면? 이제는 null이 나온다 class Brray { name = 'hello' static type = 'Hello' } let brray = new Brray(); console.log(brray.name) console.log(brray.hasOwnProperty('name')) // 이런 모습의 생성자를 만들어서 객체를 만들어보자 // brray.name 값이 잘 확인된다 // brray.hasOwnProperty 로 name 을 확인해봐도 true로써 속성이 존재함이 확인된다 // static키워드를 붙인 속성인 type은 brray객체와는 전혀 상관없는 요소가 된다. console.log(Brray.type); console.log(Brray.hasOwnProperty('type')); console.log(Object.keys(Brray)); console.log(Object.getOwnPropertyDescriptor(Brray, 'type')) // 이것에 접근하는 방법은 Brray.type이다 // Brray.hasOwnProperty 로 확인했을때 true로써 type은 Brray의 객체에 포함된 속성으로 확인되고 // Object.keys 로도 확인된다. Object.keys로 확인된다는 것은 enumerable이 true라는 뜻이고 Object.getOwnPropertyDescriptor로 정말 그런지 확인해본결과 // 맞는것으로 확인된다 // 즉 static키워드를 붙인것은 Brray.type2 = 'World' // 이런식으로 추가된것과 같다고 볼 수 있다 class Crray extends Array { } let crray = new Crray(); console.log(crray['forEach']); // Array를 상속받는 Crray를 만들어보자 // 그리고 forEach 속성을 확인해본 결과 접근이 가능하다 // 일단 forEach는 crray의 직접적 속성으로 존재하는것은 아니다 console.log(Object.getPrototypeOf(crray) === Crray.prototype) console.log(Object.getPrototypeOf(Object.getPrototypeOf(crray)) === Array.prototype) console.log(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(crray))) === Object.prototype) // 위와 같은 방법으로 확인해보면 모두 true가 나오는것을 확인할 수 있다 // extends 한다는것은 prototype이 연결되게 됨을 확인할 수 있다 // Array또한 extends Object를 하고있는 모습으로 확인된다 // 그렇기 때문에 Object.prototype 에 있는 모든 함수는 crray 를 통해서도 [] 를 통해서도 접근이 가능한것이다 console.log(crray.hasOwnProperty); console.log([].hasOwnProperty); console.log(crray.hasOwnProperty === Object.prototype.hasOwnProperty); // 이렇게말이다 class Drray { name = 'dd' method() { return 'hello'; } } let drray = new Drray(); console.log(drray.method()) // 위와 같이 method 메소드를 만들어보자 // 그리고 이것은 drray.method() 이런식으로 접근이 가능하다 console.log(drray.hasOwnProperty('method')); console.log(Object.getOwnPropertyNames(drray)) // 이 method란 것이 drray 객체의 속성으로 들어가있을지 확인해봤다. hasOwnProperty로는 false가 나온다 // Object.getOwnPropertyNames 로는 name만 확인된다. // method는 어디에 있는걸까 // 프로토타입을 확인해보자 console.log(Object.getPrototypeOf(drray)) // 여기에 들어가있음이 확인된다 // 즉 Drray.prototype.method2 = function method2() { return 'hello2'; } console.log(drray.method2()) // 해서 만든것과 비슷하다는 의미가 된다. // 이렇게 method2 를 추가한 후 prototype을 확인해보자 console.log(Object.getPrototypeOf(drray)) // 자 이렇게 확인해보자 // method, method2, constructor가 확인되는데 여기서 method2만 enumerable이 true로 보인다. // 정말 그런지 확인해보자 console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'method')) console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'method2')) console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'constructor')) // 확인 결과 method2의 enumerable은 true임이 확인된다 Object.defineProperty(Drray.prototype, 'method3', { value: function method3() { return 'hello3'; }, enumerable: false, configurable: true, writable: true, }); console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'method')) console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'method2')) console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'method3')) console.log(Object.getOwnPropertyDescriptor(Drray.prototype, 'constructor')) // 위와 같이 추가를 하면 모습이 같아지는 것을 확인 할 수 있다 // 참고로 enumerable, configurable, writable 값을 지정을 안해주면 기본은 false이다 // 그러므로 위 상황에서 enumerable는 false로 할것이라면 안써줘도 상관없었다

결론은 같다