JavaScriptでは、配列コンストラクターを使用して配列を作成するか、[]を使用して迅速に作成できます。これも優先方法です。アレイはオブジェクトから継承されたプロトタイプであり、TypeOFの特別な返品値はなく、「オブジェクト」のみを返します。
JSでは、すべてがオブジェクトであり、配列も配列であると言うことができます。
多くのオブジェクトには、アレイのプッシュ、コンカット、スライスなどの多くの便利な方法がありますが、一部のオブジェクトがこれらの方法を実装していない場合でも、これらの機能を使用したいと考えています。それで、私は何をすべきですか?
1.多くの方法は非常に効率的な実装を提供し、それらの実装をシミュレートすることができます。
たとえば、IE8以下のブラウザは、配列インデックスのメソッドをサポートしていません。配列サポートインデックスを作成するために、次のメソッドを実装するためのメソッドを記述できます。
(F12を押してIEブラウザでデバッグして、IE5にブラウザバージョンを選択します。)
var arr = [、、]; if(array.prototype.indexof){alert( "your browserはindex of method。") i ++){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(elt /*、from* /){var len = this.length >>>; var from = number(arguments [])|| ; from =(from <)? math.ceil(from):math.floor(from); if(from <)from+= len; for(; from <len; from ++){if(this from this [from] === elt)return;} return - ;};};};}2。継承と適用方法
オブジェクトがある場合、各オブジェクトを作成して自分で実装するのは非常に面倒ではありませんか?
高レベルの言語では、継承を使用して、次のJavaコードなどの問題を解決できます。
public class mylist <e> extends arraylist <e> {public void myadd(e e){super.add(e); system.out.println( "add:"+e);}}}しかし、JSには相続の概念はありません。このような問題を解決するために、通話を使用して応募できます。
上記のコードは次のように書き直すことができます。
var myobject = function(){} myobject.prototype.add = function(){array.prototype.push.call(this、arguments); // output argumentsfor(var i =; i <arguments.length.length; i ++){console.log( "add:"+arguments [+arguments]);}}}}}}}ここでは、MYADDメソッドが高レベル言語の継承方法に実装されていますが、MYADDメソッドは今1つのパラメーターのみを渡すことができます。複数のパラメーターを渡す場合は、別のpublic void myAdd(e [] e)メソッドを記述する必要があります。 JSは、引数オブジェクトを使用してすべてのパラメーター入力を表す1つのメソッドで実行できます。これは、高レベルの言語が行うのが困難です。
(PS、実際、あなたはJavaでpublic void myAdd(e ... e)を書くことができます。これは不確実なパラメーターです。パブリックボイドmyAdd(e [] e)の使用は同じです)
呼び出しおよび適用方法は、関数のこのポインターのポインターを変更するために使用されます。コールには2つのパラメーターのみがあり、通常、適用はパラメーターの数を知った後に使用されます。以下は例です。
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); alert(name);参照は次のとおりです。
apply(object、arg1、arg2、...)
call(object、[arg1、arg2、......])
すべてのパラメーターを含む1つの「配列」の後に通話が続くことができます。適用は構文砂糖です。パラメーターの数がわかっている場合は、適用を使用するのが非常に便利です。
上記のオブジェクトはnullまたは未定義である可能性があるため、このオブジェクトはグローバルオブジェクト(ウィンドウ)です。たとえば、上記の例に従います。
var name = 'goo'; alert(obj1.getname.call(null)); (厳密なモードでは、グローバルオブジェクトはnullであるため、例外がスローされます。
3。Object.DefineProperty
(注:IE8以下のこのタイプの機能を使用しないでください)
Microsoft:オブジェクトにプロパティを追加するか、既存のプロパティのプロパティを変更します。
ゲッター、セッター、
実際、JSのオブジェクトのプロパティにはゲッターとセッター機能もありますが、JSのゲッターとセッターはC#に似ていると個人的には考えています。
たとえば、次のコードはゲッター/セッターを定義します。
function myobj(){} object.defineproperty(myobj.prototype、 'length'、{get:function(){return this.length_; // this nable hing be hing}、set:function(value){return this.length_ = value;}});コメントされた場所は長さではありません。そうしないと、無限に再帰的になります。
セットを削除して、長さ変数の読み取り専用にすることもできます。
object.defineProperty(myobj.prototype、 'length'、{get:function(){return this.length_; // this nable hing be hing}、 /*set:function(value){return this.length_ = value;}* /}); myobj.length = 3;このコードは例外をスローします:Uncaught TypeError:Getterのみを備えた#<MYOBJ>のプロパティ長を設定できません。
オブジェクトのプロパティを読み取り専用にするには、writable:falseを使用することもできます。
object.defineProperty(myobj.prototype、 'length'、{writable:false});書き込み: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"); decriptor.writable = true; object.defineproperty(myobj.prototype、 'decriptype、' decriptotye、 '、decriptypere); Uncaught TypeError:プロパティを再定義できません:長さこれは、構成可能のデフォルト値がfalseであるためです。 DefinePropertyを呼び出した後、Configurableには偽のプロパティがあるため、逆にすることはできません。将来変更することはできません。
したがって、configureable:trueを使用する必要があり、このオブジェクトプロパティは変更できます。完全なコードは次のとおりです。
object.defineProperty(myobj.prototype、 'length'、{value:、writable:false、configurable:true}); var descriptor = object.getownPropertyDescriptor(Myobj.Prototype、 "length"); decriptor.writable = true; object.defineProperty(myobj.prototype、 'length'、descriptor); myobj.prototype.length =; var obj = new Myobj(); alert(obj.length);Sente descriptor.configurable = falseを追加できます。
それは私がこのプロパティを変更したことを意味し、あなたは将来それを変更することはできません
この機能は、多くの場合にも役立ちます。通話および適用メソッドを使用する場合、オブジェクトの長さは可変である必要があります。オブジェクトの長さ属性が読み取り専用である場合、呼び出しと適用するときに例外がスローされます。
たとえば、DomTokenListオブジェクトの長さを変更することはできません。 DOMオブジェクトdomTokenListを手に入れました、
ただし、その構成可能は真実であり、その長さプロパティを変更できるように変更できます。
参照してください、この構成可能は真であり、セッターは未定義です。設定された方法を書きましょうね。
var Decriptor = object.getownPropertyDescriptor(domtokenList.prototype、 'length'); descriptor.set = function(value){this.length = value;} object.defineProperty(domtokenList.prototype、 'length'、dercriptor);その後、実行します
別の例外がスローされました。
これは、これを設定すると、長さを設定すると、書いたセットメソッドで無限に再発するためです。
したがって、deleteを使用して、長さの属性の影響を排除する必要があります。つまり、次のとおりです。
var Decruptor = object.getownPropertyDescriptor(domtokenList.prototype、 'length'); descriptor.set = function(value){delete domtokenList.prototype.length; this.length = value;} object.defineProperty(domtokenlist.prototype、 'length'、descriptor);このようにして、DomTokenListはプッシュ、ポップ、その他の操作もサポートしています。
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(引数)メソッドは、引数オブジェクトを配列に変換するために使用されます。