아래 시각화에서
두 개의 배열 개체가 있습니다 (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
완전히 작동하는 배열입니까?
댓글
Answer
Array-prototype은 객체가 배열로 작동하는 데 필요한 모든 기능을 포함해야하기 때문에 그 자체로 완전한 기능을하는 배열입니다. Array 인스턴스는 프로토 타입을 통해 모든 기능을 상속합니다.
사양 에 따르면 :
Array 프로토 타입 객체는 그 자체가 배열입니다. [[Class]]는 “Array”이고 길이 속성 (초기 값이 +0)과 15.4.5.1에 설명 된 특수 [[DefineOwnProperty]] 내부 메서드가 있습니다.
댓글
- 그러나
length
속성은 인스턴스 수준 속성입니다. 모든 배열 인스턴스에는 고유 한length
값이 있습니다.Array.prototype
에length
속성을 배치하는 이유는 무엇입니까?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가 상속 받습니까?
array
입니까? " 이에 대한 답은 자명하다고 생각합니다. 동일한 이유로 클래스의 기능을 추상 클래스와 다음에서 상속되는 클래스로 분할했습니다.Array.prototype
가Object
이상인 이유는 무엇입니까? 요소를 저장하는 기능을 제공한다는 의미에서 더 많이.[42]
는 본질적으로{ "0": 42 }
와 동일하지만 프로토 타입이 다르고 펑키 한length
를 사용합니다. property.length
속성이있는 것은 아닙니다. 여기에서Array.prototype
는 완전한 기능을 갖춘 배열입니다.