この記事を読むには、他の言語でのプログラミングエクスペリエンスが必要です。
JavaScriptのシンプルなタイプは次のとおりです。
1。番号
2。文字列
3。ブール(真と偽)
4.ヌル
5.未定
他のタイプはオブジェクトです(Typeofオペレーターの返品値に混乱するべきではありません)。
1。関数
2.アレイ
3。正規表現
4。オブジェクト(オブジェクトは自然にオブジェクトです)
オブジェクトベース
JavaScriptでは、オブジェクトはプロパティのコレクションです(オブジェクトは連想配列です)、各プロパティには以下が含まれます。
1.属性名は文字列でなければなりません
2。属性値は未定義以外の値にすることができます
オブジェクトを介してオブジェクトを作成するリテラル:
コードコピーは次のとおりです。
//オブジェクトリテラル{}を介して空のオブジェクトを作成します
var empty_object = {};
オブジェクトの属性名と属性値:
コードコピーは次のとおりです。
var stande = {
//「ファーストネーム」は属性名で、「ジェローム」は属性値です
「ファーストネーム」:「ジェローム」、
//「last-name」は属性名で、「howard」は属性値です
「最後の名前」:「ハワード」
};
属性名が法的識別子である場合、引用符は省略できます。
コードコピーは次のとおりです。
var flight = {
航空会社:「海洋」、
番号:815、
部門: {
IATA:「シド」、
時間: "2004-09-22 14:55"、
市:「シドニー」
}、
到着: {
IATA:「lax」、
時間: "2004-09-23 10:42"、
市:「ロサンゼルス」
}
};
プロパティアクセスの例を見てみましょう。
コードコピーは次のとおりです。
var所有者= {name: "name5566"};
owner.name; //「name5566」
所有者["name"]; //「name5566」
owner.job; // 未定義
owner.job = "coder"; //または所有者["job"] = "coder";
属性名が法的識別子ではない場合、引用符で包む必要があります。存在しないプロパティの価値は未定義です。オブジェクトは、値ではなく参照によって渡されます。
コードコピーは次のとおりです。
var x = {};
var所有者= x;
owner.name = "name5566";
x.Name; // x.name === "name5566"
ここで、xと所有者は同じオブジェクトを参照します。
オブジェクトの属性は、削除演算子を使用して削除できます。
コードコピーは次のとおりです。
obj.xを削除します。 //オブジェクトobjのx属性を削除します
オブジェクトのプロトタイプ
各オブジェクトはプロトタイプオブジェクトにリンクされており、オブジェクトはプロトタイプオブジェクトから属性を継承できます。オブジェクトを介してオブジェクトを作成します。そのプロトタイプオブジェクトはオブジェクトです。プロトタイプオブジェクト(Object.Prototypeオブジェクト自体にはプロトタイプオブジェクトがありません)。オブジェクトを作成すると、オブジェクトのプロトタイプオブジェクトを設定できます(そして、特定の設定方法について説明します)。オブジェクトの属性を取得しようとするとき、オブジェクトが存在しない場合、JavaScriptはこのオブジェクトのプロトタイプオブジェクトから属性を取得しようとします。プロトタイプオブジェクトにそのような属性がない場合、このプロトタイプオブジェクトのプロトタイプオブジェクトから検索します。属性の取得と比較して、オブジェクトの属性を変更すると、プロトタイプオブジェクトには影響しません。
機能的な基本
関数はJavaScriptのオブジェクトでもあり、function.prototypeプロトタイプオブジェクト(function.prototypeリンクへのリンク)にリンクされています。関数にはプロトタイプというプロパティがあり、その値はオブジェクトです。このオブジェクトにはプロパティコンストラクターがあり、コンストラクターの値はこの関数です。
コードコピーは次のとおりです。
var f = function(){}
型f.prototype; // '物体'
Typeof f.prototype.constructor; // '関数'
f === f.prototype.constructor; // 真実
関数はオブジェクトであり、オブジェクトの使用などの関数を使用できます。つまり、関数を変数や配列に保存し、関数のパラメーターとして渡すことができ、関数は関数内で定義できます。サイドノートとして、関数には2つの隠されたプロパティがあります。
1。関数のコンテキスト
2。関数コード
関数は次のように作成されます。
コードコピーは次のとおりです。
var f = function add(a、b){
a + bを返します。
}
console.log(f); //出力[関数:追加]
キーワード関数の後の関数名はオプションです。主にいくつかの目的のために関数名を定式化します。
1。再帰コールの場合
2。機能を識別するためにデバッガー、開発ツールなどが使用されます
多くの場合、関数名は必要ありません。機能名のない関数は匿名関数と呼ばれます。パラメーターリストはブラケットに包まれています。 JavaScriptは、実際のパラメーターと正式なパラメーターの一致を必要としません。
コードコピーは次のとおりです。
var add = function(a、b){
a + bを返します。
}
追加(1、2、3); //実際のパラメーターと正式なパラメーターが一致しません
実際のパラメーターが多すぎると、過剰な実際のパラメーターは無視されます。実際のパラメーターが少なすぎる場合、割り当てられていない正式なパラメーターの値は未定義です。関数には返品値が必要です。返品値が返されたステートメントを介して指定されていない場合、関数返信値は未定義です。
関数にアクセスする関数と外部変数は閉鎖です。これがJavaScriptの重要な魅力です。
関数呼び出し
各関数が呼び出されると、2つの追加パラメーターが受信されます。
1.これ
2.Arguments
これの値は、特定の呼び出しパターンに関連しています。 JavaScriptには4つの呼び出しパターンがあります。
1。メソッド呼び出しモード。オブジェクトのプロパティが関数である場合、メソッドと呼ばれます。メソッドがOM(args)を介して呼び出される場合、これはオブジェクトoです(これは、これとoが呼び出されたときにのみバインドされていることがわかります)。
コードコピーは次のとおりです。
var obj = {
値:0、
増分:function(v){
this.value +=(typeof v === 'number'?v:1);
}
};
obj.increment(); // this === obj
2。関数呼び出しモード。関数がオブジェクトのプロパティではない場合、それは関数と呼ばれ、これは以下など、グローバルオブジェクトにバインドされます。
コードコピーは次のとおりです。
メッセージ= 'Hello World';
var p = function(){
console.log(this.message);
}
p(); //出力「HelloWorld」
この動作は時々混乱しています、例を参照してください:
コードコピーは次のとおりです。
obj = {
値:0、
増分:function(){
var helper = function(){
//グローバルオブジェクトの値に1を追加する
this.value += 1;
}
//ヘルパーは関数として呼ばれます
//したがって、これはグローバルオブジェクトです
ヘルパー();
}
};
obj.increment(); // obj.value === 0
私たちが期待する結果は次のとおりです。
コードコピーは次のとおりです。
obj = {
値:0、
増分:function(){
var that = this;
var helper = function(){
that.value += 1;
}
ヘルパー();
}
};
obj.increment(); // obj.value === 1
3。コンストラクターコールモード。たとえば、新しいプレフィックスを使用する意図の関数は、コンストラクターと呼ばれます。
コードコピーは次のとおりです。
//テストはコンストラクターと呼ばれます
var test = function(string){
this.message = string;
}
var mytest = new Test( "Hello World");
関数は新しいで呼び出すことができます(このような関数は通常、大文字から始まります)。新しい機能を追加すると、この関数のプロトタイププロパティにリンクされたオブジェクトが作成され、コンストラクター内のこのオブジェクトはこのオブジェクトです。
4.コールモードを適用します。関数の適用方法は、2つのパラメーターがある関数を呼び出すために使用されます。1つ目はこれで、2番目はパラメーターの配列です。たとえば
コードコピーは次のとおりです。
var add = function(a、b){
a + bを返します。
}
var ret = add.Apply(null、[3、4]); // ret === 7
関数を呼び出すと、すべての引数を含む引数(非リアルJavaScriptアレイ)と呼ばれるクラスの配列にアクセスできます。これにより、さまざまな長さのパラメーターを実装できます。
コードコピーは次のとおりです。
var add = function(){
var sum = 0;
for(var i = 0; i <arguments.length; ++ i){
sum += arguments [i];
}
返品額;
}
追加(1、2、3、4);
異常な
次に、JavaScriptの例外処理メカニズムについて話しましょう。スローステートメントを使用して例外をスローし、トライキャッシュステートメントを使用して例外をキャッチして処理します。
コードコピーは次のとおりです。
var add = function(a、b){
if(typeof a!== 'number' || typeof b!== 'number'){
//例外をスローします
投げる {
名前: 'TypeRror'、
メッセージ:「ニーズ番号を追加」
};
}
a + bを返します。
}
//例外をキャッチして処理します
試す {
add( "7");
// Eはスローされた例外オブジェクトです
} catch(e){
console.log(e.name + ':' + e.message);
}
JavaScriptタイプにプロパティを追加します
コンストラクターは、JavaScriptのほとんどのタイプに存在します。
1。オブジェクトのコンストラクターはオブジェクトです
2。配列のコンストラクターは配列です
3。関数の構成要因は関数です
4。文字列のコンストラクターは文字列です
5。数字のコンストラクターは数字です
6.ブールのコンストラクターはブール値です
7.正規表現の構築装置はregexpです
コンストラクターのプロトタイプにプロパティ(多くの場合、メソッドを追加)を追加して、このプロパティを関連する変数が利用できるようにすることができます。
コードコピーは次のとおりです。
number.prototype.integer = function(){
数学を返す[これ<0? 'ceil': 'floor'](this);
}
(1.1).integer(); // 1
範囲
JavaScriptは関数を介してスコープを構築する必要があります。
コードコピーは次のとおりです。
関数() {
// ...
}();
匿名関数がここで作成され、実行されます。露出したくない変数を非表示にする範囲:
コードコピーは次のとおりです。
var obj = function(){
//値を非表示、外部からアクセスできません
var値= 0;
戻る {
//このメソッドのみが値を変更できます
増分:function(){
値 += 1;
}、
//このメソッドのみが値を読み取ることができます
getValue:function(){
返品値。
}
};
}();
obj.increment();
obj.getValue()=== 1;
継承
JavaScriptに継承を実装するには多くの方法があります。
オブジェクトを作成するとき、オブジェクトに関連付けられたプロトタイプオブジェクトを設定できます。
コードコピーは次のとおりです。
//プロトタイプオブジェクトを使用してオブジェクトを作成{x:1、y:2}
var o = object.create({x:1、y:2});
Object.CreateメソッドはECMAScript 5で定義されています。ECMAScript3を使用する場合、作成方法を自分で実装できます。
コードコピーは次のとおりです。
// object.createメソッドが定義されていない場合
if(typeof object.create!== 'function'){
// object.createメソッドを作成します
object.create = function(o){
var f = function(){};
f.prototype = o;
//新しいオブジェクトを作成すると、このオブジェクトのプロトタイプオブジェクトはoです
新しいf()を返します。
};
}
Object.Createメソッドを介して、プロトタイプベースの継承を実行します。新しいオブジェクトは、古いオブジェクトのプロパティを直接継承します(クラスベースの継承と比較して、クラスの存在は必要ありません。オブジェクトはオブジェクトを直接継承します)。例:
コードコピーは次のとおりです。
var mymammal = {
名前:「哺乳類のハーブ」、
get_name:function(){
this.nameを返します。
}、
言う:function(){
this.saying ||を返します'';
}
};
// mymammalを継承します
var mycat = object.create(mymammal);
mycat.name = 'henrietta';
mycat.saying = 'meow';
mycat.purr = function(n){
var i、s = '';
for(i = 0; i <n; i += 1){
if(s){
s += ' - ';
}
s += 'r';
}
s;
};
mycat.get_name = function(){
this.says() + '' + this.name + '' + this.says()を返します。
};
上記のコードは簡単ですが、プライベートメンバーを保護することはできません。モジュールモードを使用できます。モジュールモードでは、特定のタイプのオブジェクトが関数によって生成され、関数スコープを使用してプライベートメンバーを外部アクセスから保護します。
コードコピーは次のとおりです。
//哺乳類のオブジェクトの構築に使用される哺乳類機能
var mammal = function(spec){
//それが構築されたオブジェクトです
var that = {};
// public Method get_nameには外部からアクセスできます
that.get_name = function(){
// Spec.Nameには外部から直接アクセスできません
return spec.name;
};
//パブリックメソッドには、外部からアクセスできると書かれています
that.says = function(){
// spec.saying外部への直接アクセスはありません
spec.saying ||を返します'';
};
それを返します。
};
//哺乳類のオブジェクトを作成します
var mymammal =哺乳類({name: 'herb'});
// CATオブジェクトの構築に使用される猫機能
var cat = function(spec){
spec.saying = spec.saying || 'ニャー';
//猫は哺乳類から継承するので、最初に哺乳類の物体を構築します
var that =哺乳類(spec);
// public Method purrを追加します
that.purr = function(n){
var i、s = '';
for(i = 0; i <n; i += 1){
if(s){
s += ' - ';
}
s += 'r';
}
s;
};
// public Method get_nameを変更します
that.get_name = function(){
that.says() + '' + spec.name +を返します
' + that.says();
それを返します。
};
};
// CATオブジェクトを作成します
var mycat = cat({name: 'henrietta'});
モジュールモードでは、コンストラクターを呼び出すことにより、継承が達成されます。さらに、サブクラスの親クラスのメソッドにもアクセスすることもできます。
コードコピーは次のとおりです。
object.prototype.superior = function(name){
var that = this、method = that [name];
return function(){
return method.apply(それ、引数);
};
};
var coolcat = function(spec){
//サブクラスのget_nameメソッドを取得します
var that = cat(spec)、super_get_name = that.superior( 'get_name');
that.get_name = function(n){
'like' + super_get_name() + 'baby'を返します。
};
それを返します。
};