JavaScript에서 배열은 배열 생성자를 사용하여 생성하거나 []를 사용하여 빠르게 생성 할 수 있으며, 이는 선호하는 방법입니다. 배열은 객체에서 상속 된 프로토 타입이며 Typeof에 대한 특수 반환 값이 없으며 '개체'만 반환합니다.
JS에서는 모든 것이 객체이며 배열도 배열이라고 말할 수 있습니다.
많은 객체에는 푸시, 컨택, 슬라이스 등과 같은 많은 편리한 방법이 있지만 일부 객체가 이러한 메소드를 구현하지 않으면 이러한 기능을 사용하려고합니다. 그래서 어떻게해야합니까?
1. 많은 방법이 매우 효율적인 구현을 제공하며 구현을 시뮬레이션 할 수 있습니다.
예를 들어, IE8 아래의 브라우저는 배열 인덱스 메소드를 지원하지 않습니다. 배열 지원 인덱스를 만들기 위해 INDEXOF 메소드를 구현하는 메소드를 작성할 수 있습니다.
(F12를 눌러 IE 브라우저로 디버그하여 IE5로 브라우저 버전을 선택하십시오.)
var arr = [,,,]; if (array.prototype.indexof) {alert ( "당신의 브라우저가 indexof methods를 지원합니다.");} else {alert ( "당신의 브라우저는 indexof method를 지원하지 않습니다. {if (this [i] == item) {return i;}} return-;}} alert (arr.indexof ()); alert (arr.indexof ());물론이 방법은 매우 쓰레기입니다. 여기에서 특정 구현에 못 생겼으며 Baidu의 사본 버전을 제공합니다.
관심이 있으시면 V8 엔진이 구현되는 방법 https://github.com/v8/v8/blob/master/src/js/array.js를 확인할 수 있습니다.
if (! array.prototype.indexof) {array.prototype.indexof = function (* /) {var len = this.length >>>; var (arguments []) || ; from = (<)? math.ceil (from) : math.floor (from); if (from <) from+= len; for (; from <len; from ++) {if (this && this [from this [from this [this [this [this [] === elt) return-;};}}.2. 상속 호출 및 적용 방법
우리가 객체가 있다면, 각 객체를 작성하여 직접 구현하는 것이 매우 번거롭지 않습니까?
고급 언어에서는 상속을 사용하여 다음 Java 코드와 같은 문제를 해결할 수 있습니다.
공개 클래스 mylist <e> arraylist <e> {public void myadd (e e) {super.add (e); system.out.println ( "add :"+e);}}그러나 JS에는 상속의 개념이 없습니다. 우리는 전화를 사용하고 그러한 문제를 해결하기 위해 신청할 수 있습니다.
위의 코드는 다음과 같이 다시 작성할 수 있습니다.
var myObject = function () {} myObject.prototype.add = function () {array.prototyp.push.call (this, arguments); // output arguments for (var i =; i <arguments.length; i ++) {console.log ( "add :"+arguments [i]););여기에서 볼 수 있습니다. MyADD 메소드는 고급 언어의 상속 메소드에서 구현되지만 MyADD 메소드는 이제 하나의 매개 변수 만 전달할 수 있습니다. 여러 매개 변수를 전달하려면 다른 공개 무효 MyADD (E [] e) 메소드 또는 공개 무효 MyADD (List <E> e) 메소드를 작성해야합니다. JS는 인수 객체를 사용하여 모든 매개 변수 입력을 나타내는 하나의 방법으로 수행 할 수 있으며, 이는 높은 수준의 언어가하기가 어렵습니다.
(실제로, 당신은 Java에서 public void myadd (e ... e)를 쓸 수 있습니다. 이것은 불확실한 매개 변수입니다. 공개 void myadd (e [] e)의 사용은 동일합니다).
호출 및 적용 방법은 기능 에서이 포인터의 포인터를 변경하는 데 사용됩니다. 통화에는 두 개의 매개 변수 만 있으며 일반적으로 매개 변수 수를 알면 적용됩니다. 다음은 예입니다.
var obj = function (name) {this.name = name;} obj.prototype.getname = function () {return this.name;} var obj1 = new obj ( "zou"); var obj2 = {name}; var name = obj1.getname.call (obj2);참조 참조는 다음과 같습니다. 참조는 다음과 같습니다. 참조는 다음과 같습니다.
적용 (Object, Arg1, Arg2, ...)
콜 (Object, [arg1, arg2, ......])
모든 매개 변수를 포함하여 하나의 "배열"에 이어 통화가 이어질 수 있습니다. 적용은 구문 설탕입니다. 매개 변수 수를 알고 있다면 적용하는 것이 매우 편리합니다.
위의 객체는 또한 널 또는 정의되지 않으므로이 객체는 글로벌 객체 (창)입니다. 예를 들어 위의 예는 다음과 같습니다.
var name = 'goo'; alert (obj1.getname.call (null)); (엄격한 모드에서는 글로벌 객체가 null이므로 예외가 발생합니다.
3. Object.DefineProperty
(참고 : IE8 아래 에서이 유형의 기능을 사용하지 마십시오)
Microsoft : 객체에 속성을 추가하거나 기존 속성의 속성을 수정하십시오.
게터, 세터,
실제로 JS의 객체의 특성에 대한 getters and setter 함수도 있지만 JS의 Getters와 Setter는 개인적으로 C#과 같다고 생각합니다.
예를 들어 다음 코드는 getter/setter를 정의합니다.
함수 myobj () {} object.defineProperty (myobj.prototype, 'length', {get : function () {return this.length_; this. this. this.}, set : function (value) {return this.length_ = value;}});주석은 장소의 길이가 될 수 없습니다. 그렇지 않으면 무한히 재귀 적입니다.
세트를 제거하고 길이 변수를 읽을 수 있습니다.
Object.defineProperty (myobj.prototype, 'length', {get : function () {return this.length_; // 길이가 될 수 없습니다.이 코드는 예외를 던집니다. upphed typeerror : getter 만있는 #<myobj>의 속성 길이를 설정할 수 없습니다.
객체의 속성을 읽기 전용으로 만들려면 Writable : False를 사용할 수도 있습니다.
object.defineProperty (myObj.prototype, 'length', {writable : false});쓰기 가능 : 거짓은 get set과 공존 할 수 없으며, 그렇지 않으면 유형 오류가 발생합니다.
구성 가능 : 삭제 명령문으로 삭제할 수 있지만 구성 가능한 속성은 엄격한 모드에서 유효한 것 같습니다. 이러한 코드는 여전히 비 스트릭 모드에서 실행될 수 있습니다. (엄격한 모드에서 오류 가보고되었습니다)
Object.DefineProperty (myObj.prototype, 'length', {configurable : false}); var obj = new MyObj (); delete obj.length;값 : 객체의 고정 값을 지정합니다. 값 : 10,이 객체의 초기 값이 10임을 나타냅니다.
비 스트릭 모드에서는 이러한 코드가 오류를보고하지 않으며 엄격한 모드에서는 오류 가보고됩니다.
object.defineProperty (myObj.prototype, 'length', {writable : false, value : '10 '}); var obj = new myobj (); obj.length = 100;GetOwnPropertyDescriptor를 사용하여 이러한 값을 얻고 수정할 수 있습니다. 예를 들어, 이제 내 길이 속성은 읽기 전용입니다.
그러한 코드를 실행하지만 오류가 발생했습니다.
Object.DefineProperty (myObj.prototype, 'length', {value :, writable : false,}); var descriptor = object.getOwnPropertyDescriptor (myObj.prototype, "length"); describle = true; object.defineProperty (myobj.prototype, 'destcriptor); 끊임없는 TypeError : 속성을 재정의 할 수 없습니다 : 길이구성 가능의 기본값이 False이기 때문입니다. DefineProperty를 호출 한 후 구성 가능한 것은 잘못된 속성을 가지므로 반전 할 수 없습니다. 미래에는 바꿀 수 없습니다.
따라서 구성 가능 : true를 사용해야 하며이 객체 속성을 수정할 수 있습니다. 전체 코드는 다음과 같습니다.
Object.DefineProperty (myobj.prototype, 'length', {value :, writable : false : configurable : true}); var descriptor = Object.GetOwnPropertyDescriptor (myObj.prototype, "length"); descriptor.writable = true; object.defineProperty (myobj.prototype, 'length', descriptor); myobj.prototype.length =; var obj = new myobj (); Alert (obj.length);문장 descriptor.configurable = false를 추가 할 수 있습니다.
그것은 내가이 속성을 수정했으며 앞으로 수정할 수 없다는 것을 의미합니다.
이 기능은 많은 경우에도 유용합니다. 통화 및 적용 메소드를 사용하는 경우 객체의 길이는 가변적이어야합니다. 객체의 길이 속성이 읽기 전용이면 호출 및 적용 할 때 예외가 발생됩니다.
예를 들어 Domtokenlist 객체의 길이를 변경할 수 없습니다. 나는 dom object domtokenlist를 얻었다.
그러나 구성 가능성은 사실입니다. 길이 속성을 변경할 수 있도록 수정할 수 있습니다.
이 구성 가능성은 사실이며 세터는 정의되지 않았습니다. 정해진 방법을 작성합시다. 괜찮지 않습니까?
var descriptor = Object.GetOwnPropertyDescriptor (domtokenlist.prototype, 'length'); descriptor.set = function (value) {this.length = value;} object.defineProperty (domtokenlist.prototype, 'length', descriptor);그런 다음 달리기,
또 다른 예외는 버렸다.
길이를 설정할 때 우리가 쓰는 세트 방법에서 무한히 되풀이되기 때문입니다.
따라서 길이 속성의 영향을 제거하기 위해 삭제를 사용해야합니다.
var descriptor = Object.GetOwnPropertyDescriptor (domtokenlist.prototype, 'length'); descriptor.set = function (value) {delete domtokenlist.prototype.length; this.length = value;} object.defineProperty (domtokenlist.prototype, 'length', descriptor);이런 식으로 Domtokenlist는 Push, Pop 및 기타 작업을 지원합니다.
Array.prototype.push.call (document.body.classlist, 'ABC')
그런 다음 캡슐화하십시오
domtokenlist.prototype.push = function () {array.prototype.push.call (document.body.classlist, array.prototype.slice.call (arguments));}Array.prototype.slice.call (Arguments) 메소드는 인수 객체를 배열로 변환하는 데 사용됩니다.