Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

array prototype을 상속받으면 array 객체가 되나요? #2

Open
MartianLee opened this issue Jul 2, 2020 · 2 comments
Open

Comments

@MartianLee
Copy link
Owner

우선 array의 prototype을 상속받는 방법이 궁급합니다.
그리고 완전히 array처럼 작동하는지도 궁금합니다.

@jekwan
Copy link
Collaborator

jekwan commented Jul 7, 2020

각각 Array와 Object를 생성하고, 같은 형태가 되도록 Array 원소([1,2,3])와 객체의 프로퍼티({0:1, 1:2, 2:3})를 설정한 상태에서
단순히 Object의 프로토타입 링크를 Array의 프로토타입 오브젝트로 설정해서 테스트해 본 결과. Object를 Array로 인식하지는 않았습니다.
배열과 객체가 표현되는 모양새는 비슷하지만 자바스크립트 엔진단에서 처리할 때 차이가있어서 단순히 프로토타입 상속만으로 객체가 배열이 되지는 않는 것 같습니다.

[ 참고 - Object를 Array로 만드는 여러가지 방식들 ]
https://stackoverflow.com/questions/38824349/how-to-convert-an-object-to-an-array-of-key-value-pairs-in-javascript

결론 - 단순히 프로토타입 링크를 바꾸는것으로 Object가 Array로 바뀌지는 않았습니다. Object를 Array로 변환하고 싶다면 Object가 제공하는 다양한 함수들로 Object의 Key와 Value를 읽어서 새로운 Array를 만드는 방법이 널리쓰이는 것 같습니다. 메모리를 할당하고 값을 읽어서 새로 Array를 생성해야 합니다.

@MartianLee
Copy link
Owner Author

arr1 = []
arr2 = {}
arr2.__proto__ = Array.prototype
arr2 // Array {}
arr2.push('1');
arr2.push('2');
arr2.push('3');
arr2.length = 0;
arr2 // [] 일거라 예상되지만 [0: "1", 1: "2", 2: "3"] 이 나옴.

덧붙여서, Array 객체가 처음 생성될 때 Array.constructor가 호출됩니다.
Array.constructor를 콘솔에 쳐보니까 native code라고 나옵니다.
잠깐 검색해본 결과 구현이 나와 있지 않네요.
constructor에서 단순히 prototype을 array로 하는 것 뿐만 아니라 일반 object와 다른 처리를 하는게 아닐까 추측(...) 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants