Array.prototype이 완전한 기능의 배열로 설계된 이유는 무엇입니까?

아래 시각화에서

여기에 이미지 설명 입력

두 개의 배열 개체가 있습니다 (cars & bikes),

var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"]; 

[[Class]] 속성 값은 Array입니다.

또한 다음과 같이 완전히 작동하는 배열 인 Array.prototype도 있습니다. 아래 그림과 같이

> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2 

일반적으로 prototype에 무언가를 올려 놓으면 개체의 모든 인스턴스가 동일한 속성.

질문 :

length 속성을 회원으로 사용하면 Array.prototype 완전히 작동하는 배열입니까?

댓글

  • < 객체 > .pr ototype은 항상 객체입니다. 프로토 타입의 요점은 메소드 이름에서 여러 다른 객체가 공유하는 실제 메소드로의 맵이라는 점입니다 '. Array.prototype도 배열이라는 사실은 모든 배열이 특수 객체라는 사실과 관련이 있습니다. Array.prototype이 일반 객체가 아닌 배열 인 이유를 묻고 있습니까? 아니면 JS 프로토 타입이 문자열-> 함수 맵으로 제한되지 않는 이유는 무엇입니까? 아니면 왜 JS 배열이 특별한 객체입니까? 아니면 다른 질문이 있습니까?
  • ' 아마 잘못된 질문을하고있을 것입니다. 올바른 질문은 " 왜 ' 완전히 작동하지 않는 array 입니까? " 이에 대한 답은 자명하다고 생각합니다. 동일한 이유로 클래스의 기능을 추상 클래스와 다음에서 상속되는 클래스로 분할했습니다.
  • @Ixrec Array.prototypeObject 이상인 이유는 무엇입니까? 요소를 저장하는 기능을 제공한다는 의미에서 더 많이.
  • @overexchange 그러나 객체는 요소도 저장합니다. 정수 키로 요소를 저장하는 것을 의미하는 경우 배열은 객체이기 때문에 '도 그렇게하지 않습니다. 정수 키는 항상 문자열로 변환됩니다 (Javascript가 약간 이상하기 때문). [42]는 본질적으로 { "0": 42 }와 동일하지만 프로토 타입이 다르고 펑키 한 length를 사용합니다. property.
  • @Ixrec 그러나 모든 개체에 개체에 저장된 각 속성에 대해 증가하는 length 속성이있는 것은 아닙니다. 여기에서 Array.prototype는 완전한 기능을 갖춘 배열입니다.

Answer

Array-prototype은 객체가 배열로 작동하는 데 필요한 모든 기능을 포함해야하기 때문에 그 자체로 완전한 기능을하는 배열입니다. Array 인스턴스는 프로토 타입을 통해 모든 기능을 상속합니다.

사양 에 따르면 :

Array 프로토 타입 객체는 그 자체가 배열입니다. [[Class]]는 “Array”이고 길이 속성 (초기 값이 +0)과 15.4.5.1에 설명 된 특수 [[DefineOwnProperty]] 내부 메서드가 있습니다.

댓글

  • 그러나 length 속성은 인스턴스 수준 속성입니다. 모든 배열 인스턴스에는 고유 한 length 값이 있습니다. Array.prototypelength 속성을 배치하는 이유는 무엇입니까? Array 생성자 함수에 length 속성을 배치하는 것이 합리적입니다. 인스턴스화시 모든 인스턴스는 고유 한 속성은 배열 길이를 나타냅니다. 그러나 Array 생성자 함수의 length 속성은 생성자 함수에서 예상하는 인수 수를 나타냅니다.
  • @overexchange : Objects does 생성자에서 속성을 상속하지 않고 프로토 타입에서만 상속합니다. 따라서 Array.length는 Array.prototype.length와 관계가 없습니다.
  • @JacquesB 이것은 length가 모든 배열 인스턴스 사이의 공유 속성임을 의미합니다. 인스턴스가 자체 length 속성을 수정하자마자 공유 된 length는 섀도 잉되어 쓸모 없게됩니다 (산술 연산으로 인해 섀도 잉이 발생하기 때문). 예를 들어 x.length++는 실제로 x.length = x.length + 1입니다. 따라서 모든 배열 인스턴스가 초기 length 속성을 갖도록 해당 속성의 유일한 사용입니까?
  • 모든 배열 개체에는 length 속성은 Array.prototype.length에서 파생되지 않습니다.Array.prototype[10] = 42를 설정하면 Array.prototype.length를 11로 만들 수 있지만, 물론 새로 생성 된 배열은 이것을 선택하지 않습니다. 요소를 상속합니다. [][10]를 사용해보세요. 바람직한 행동은 아닙니다. Array.prototype이 배열이되는 이유가 무엇이든 length는 이와 관련이 없습니다.
  • 왜 ' Push 등의 모든 속성이 구현 된 일반 객체가 아니므로 Array Instance가 상속 받습니까?

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다