注:章Vシリーズ参照型「のJavaScript jsの高度なプログラミングの科学」として、この記事で、[JavaScriptを]。
「再学習のJavaScript jsの高度なプログラミング」についてJSベースの学習を再検討することです。
1.オブジェクト指向とは何ですか
オブジェクト指向言語では、彼らは、クラスの概念を持っている記号であり、あなたはクラスを介して同じプロパティとメソッドを持つオブジェクトをいくつでも作成することができます。しかし、私は先に述べました。ESは、クラスという概念がないので、それはまた、クラスベースの言語の異なるオブジェクトおよびオブジェクトです。
オブジェクトの定義:「順不同属性、属性が基本値、オブジェクトや関数が含まれていてもよいです。「厳密に言えば、これは、オブジェクトが値のセット順不同であると言うことと等価です。オブジェクトの各プロパティまたはメソッドの名前を持ち、それぞれの名前を値にマッピングされます。値のデータや機能することができ、名前と値のペアのセット、より多くの何もない:だから我々は、ESオブジェクトのハッシュテーブルを想像することができます。
各オブジェクトが参照型に基づいて作成され、参照型は、カスタムタイプであってもよいし、前の章で説明したプリミティブとすることができます。
2.オブジェクトを作成します。
最も簡単な方法は、オブジェクトのインスタンスを作成し、そこにプロパティとメソッドを追加することです。
let p = new Object()
p.name = 'js'
p.age = 20
p.job = 'jizhe'
p.sayName = function() {
alert(this.name)
}
p.sayName() // js
3.ファクトリパターン
Factoryパターン:特定のオブジェクトを作成するための抽象プロセス。ESの詳細を考慮したクラスを作成することはできませんので、彼は、特定のインタフェースオブジェクトを作成するために、特定の機能をカプセル化するために使用。
function p(name, age, job) {
let o = new Object()
o.name = name
o.age = age
o.job = job
o.sayName = function() {
alert(this.name)
}
return o
}
let p1 = p('tc', 30, '老宋')
let p2 = p('bd', 22, '百度')
p1.sayName // tc
p2.sayName // bd
関数P()は、受信したパラメータに基づいて、すべての必要な情報を構築するPersonオブジェクトとすることができる含みます。私たちは、この機能を何度も呼び出すことができ、それぞれの時間は、それは3つのプロパティのメソッドを含むオブジェクトを返します。ファクトリモードは、複数の類似したオブジェクトを作成する問題を解決するが、それは物体認識の問題を解決していない(つまり、オブジェクトの種類を見つける方法)
4.コンストラクタモード
導入前の章では、ESコンストラクタは、オブジェクトの特定の型を作成するために使用することができます。ネイティブConstructorオブジェクトや配列のように、ランタイムは自動的に実行環境に表示されます。さらに、機能は、カスタムオブジェクトのプロパティおよびメソッドのタイプを定義するために、カスタムを作成するように構成されてもよいです。次のように:
function p(name, age, job) {
this.name = name
this.age = age
this.job = job
this.sayName = function (){
alert(this.name)
}
}
let p1 = new P('tc', 33, 'haha')
let p2 = new P('gg', 32, '小夭同学')
p1.sayName() // haha
p2.sayName() // 小夭同学
上記の例では、p()関数は、短い上の置換基の関数です。同じコードの内容に加えて、次のような違いがあります:
- 明示的にオブジェクトを作成できませんでした
- 直接このオブジェクトのプロパティとメソッドに割り当てられました
- いいえretrun声明ません
- また、関数pが大文字になります。コンストラクタは常に大文字に最初の文字で始まります。非コンストラクタの先頭を小文字。
あなたはPのインスタンスを作成する場合も、実際には次の4つのステップを受けるコンストラクタを呼び出して、このように、new演算子を使用する必要があります。
- 新しいオブジェクトを作成します。
- コンストラクタの範囲は、(新しいオブジェクトに、従って、この点)新しいオブジェクトを割り当てます
- コードコンストラクタを実行する(オブジェクトの属性を追加します)
- 新しいオブジェクトを返します。
オブジェクトのconstructorプロパティは、もともとオブジェクト型を識別するために使用されます。しかし、検知基準物体のタイプ、instanceofのオペレータは、より信頼性が高いです。
instanceof 判断某个对象是否属于另外一个对象的实例
利点:工場モード、それが特定の型のインスタンスとして識別することができるコンストラクタモードに比べ。
注:コンストラクタは、このように定義されている場合に定義されているグローバルオブジェクト、特に断りのない限り従って、オペレータとconstrucotr性instaceof常にグローバルスコープのクエリコンストラクタと仮定する。
4.1コンストラクタ関数として
コンストラクタと他の機能との唯一の違いは、彼らは別の方法を呼び出すことです。しかし、コンストラクタは、関数で、コンストラクタを定義するための特別な構文は存在しません。任意の関数であれば、新たなオペレータによって呼び出されるように、それはコンストラクタとして使用することができ、そして任意の関数、新しいオペレータによって呼び出されていない場合、それは異なる撮影通常の関数ではないです。
// 构造函数调用
let p = new Person('tc', 22, '哈哈哈')
p.sayName // tc
// 普通函数调用
P('gc', 23, 'oo') // 添加到 window
windwo.sayName // gc
// 在另外一个对象的作用域中调用
let o = new Object()
P.call(o, 'new', 33, 'suzhou')
o.sayName // new
4.2コンストラクタの問題
コンストラクタ使いやすいが、しかし、欠点もあります。主な問題は、それぞれが各インスタンスに再び再作成するコンストラクタメソッドを使用することです。
プロトタイプモデル
私たちは、時間の関数を作成するたびにオブジェクトへのポインタであるプロトタイプのプロパティがあります。このオブジェクトは、特定のタイプ記載のすべてのインスタンスで共有することができるプロパティとメソッドを使用することです。プロトタイプオブジェクト、そのオブジェクトは、文字通り、そのプロトタイプは、インスタンスのコンストラクタを呼び出すことによって作成された場合。プロトタイプオブジェクトを使用する利点は、それが共有の例が含まれたオブジェクトのすべてのプロパティとメソッドを与えることです。換言すれば、設定情報はもはや定義オブジェクトのインスタンスとして機能しないが、この情報は、プロトタイプオブジェクトに直接添加してもよいです。
5.1プロトタイプオブジェクトを理解します
いつでも、単に新しい漢シュウを作成し、ルールの特定のセットに応じてプロパティ関数のプロトタイプを作成し、この属性は、プロトタイプオブジェクトの機能を指します。デフォルトでは、すべてが自動的にprototypeプロパティが配置されている関数へのポインタへのポインタが含まれているプロトタイプオブジェクトのコンストラクタconstructorプロパティを取得します。このコンストラクタでは、我々は追加のプロトタイプオブジェクトのプロパティとメソッドを追加し続けることができます。
カスタムコンストラクタを作成した後、そのプロトタイプオブジェクトは、デフォルトコンストラクタのプロパティを取得します。他の方法としては、Objectから継承されます。コンストラクタを呼び出すの新しいインスタンスを作成する場合、この例の内部ポインタ(内部プロパティ)、点プロトタイプオブジェクトのコンストラクタが含ま。多くの実装では、プロパティの名前は、内部にあるプロト、スクリプトを介してアクセスすることができ、他の実装では、スクリプトの性質は完全に不可視です。しかし、本当に重要なポイントをクリアするためには、この接続がない間で、インスタンスコンストラクタで、プロトタイプオブジェクトのコンストラクタでインスタンス間に存在するということです
また、コードは、オブジェクトの属性を読み込むたびに、検索を実行します、目標は、与えられた名前の属性を持つことです。オブジェクトのインスタンス自体で始まる検索。あなたが例で指定された名前を持つプロパティを見つけた場合は、プロパティの値が返され、見つからない場合、検索は試作品の形成に与えられた名前を持つプロパティを探し、プロトタイプオブジェクトのポインタを続けています。あなたがプロトタイプオブジェクトにこのプロパティを発見した場合は、プロパティの値が返されます。我々は、すべての最初の検索が二回連続して実行されますp.sayNameを()、呼び出すことを、パーサが要求されます:PインスタンスはsayNameプロパティを持ち、そうでない場合、プロトタイプPプロパティをお願いしていsayNameまあ、存在する場合この関数はオブジェクトが読まれるプロトタイプに保存されます。
アクセス値はなく、プロトタイプ・オブジェクト・インスタンス書き換えの値によって、オブジェクト・インスタンスによってプロトタイプに格納されているが。私たちは、インスタンスに属性を追加し、プロパティは、プロトタイプのインスタンスと同じ名前のプロパティである場合、我々は例のプロパティを作成し、プロパティは、プロトタイプのプロパティをブロックします。
5.2プロトタイプとオペレータ
単独でのためのインループ内:演算子で使用するには、2つの方法があります。単独で使用される場合、所与のプロパティが真のオブジェクトを介してアクセスすることができる場合に、関係なく、プロパティは試作例に存在するか否かを、オペレータに戻されます。プロパティによるオペレータ復帰であれば)、真hasOwnPropertyを(でオブジェクトがあれば、オペレータはhasOwnPropertyを(にtrueを返すように、プロパティは、例えば内に存在する場合にのみ真を返すようにアクセスすることができる場合)falseを返す、特性を決定することができますprototypeプロパティ。
注:のためのインループを使用してオブジェクトを介して戻ってアクセスすることができる場合、属性がプロトタイプに存在する属性を含む、インスタンス属性で存在両方を含む、列挙することができます。例列挙属性では、プロトタイプの性質をシールドすることはループ内のため、戻りません。
5.3より簡単なプロトタイプの構文
一般的な方法を含む、不要な入力、及びより良い視覚機能プロトタイプパッケージを低減するために、プロパティおよびオブジェクト全体リテラルプロトタイプオブジェクトを書き換える方法を有すると言われています。
function P(){
}
P.prototype = {
name: 'tc',
age: 22,
job: 'web',
sayName: function(){
console.log(this.name)
}
}
5.4ダイナミックプロトタイプ
プロトタイプで発見プロセスの値が検索であるので、我々は、プロトタイプオブジェクトに加えられた変更は、直ちにインスタンスから反射することができます。あなたは常にプロトタイプのためのプロパティとメソッドを追加し、することができますが、変更はすぐにその中のすべてのオブジェクトインスタンスに反映させることができるが、それは全体のプロトタイプオブジェクトを書き換えることであれば、その後、状況が異なっています。さらに、実施例は、コンストラクタを呼び出す__proto__プロトタイプを当初指し示すポインタを追加するために、及び他の目的は、コンストラクタと初期プロトタイプの間の通信を遮断するプロトタイプは、同等である修正するであろうように。だけではなく、コンストラクタに試作例へのポインタ。
5.5プロトタイプネイティブオブジェクト
プロトタイプモデルの重要性は、すべてのネイティブ参照型は、このモデルを使用して作成されていても、カスタムタイプの作成に反映されていないだけ。すべてのネイティブ参照タイプ(オブジェクト、配列、文字列)プロトタイプコンストラクタのメソッドを定義します。
typeof Array.prototype.sort // function
typeof String.prototype.substring // function
デフォルトの参照方法の全てを取得することができるだけでなく、プロトタイプネイティブオブジェクトによって、新しい方法を定義することもできます。、カスタムオブジェクトのプロトタイプを変更プロトタイプのように、いつでもメソッドを追加することができますようにあなたは、ネイティブオブジェクトを変更することができます。
重要:あなたがこれを行うことができますが、プログラムの製品では、プロトタイプのネイティブオブジェクトを変更することは推奨されていませんが。メソッドの実装の不足のために、この方法は、プロトタイプでネイティブオブジェクトを追加する場合は、別のサポートの実現に、この方法を、コードを実行するときに、それが名前の競合につながる可能性があり、そうかもしれませんし誤っネイティブメソッドを上書き
5.6プロトタイプオブジェクトの問題
プロトタイプモデルは欠点があり、まず、それが初期化パラメータは、コンストラクタのこの部分を通過した省略し、結果は同じ属性値のデフォルトのすべてのインスタンスで達成されます。が、これはある程度の不便をもたらしたが、その最大の問題は、それが原因とその性質によって共有されています。
試作品では、すべての属性は、多くのインスタンスで共有されている、そのような機能は、共有のために非常に適しています。また、基本的な値が含まれている属性が、参照型の属性値があるため人のために、問題があります。
6.モデルとプロトタイプモデルコンストラクタの組み合わせ
最も一般的な方法は、モデルとプロトタイプコンストラクタモードの組み合わせを使用することで、カスタム・タイプを作成します。インスタンスプロパティのモデルコンストラクタが定義され、プロトタイプモデルは、メソッドと共有プロパティを定義するために使用されます。各インスタンスの結果は、インスタンス属性の独自のコピーを持っているが、同時に、省メモリを最大化する方法を参照して共有します。
7.ダイナミックプロトタイプモデル
ビットプロトタイプコンストラクタの使用を維持しながら、これは、コンストラクタによってプロトタイプを初期化し、コンストラクタ内のすべての情報をカプセル化します。それは、プロトタイプを初期化するかどうかを決定するために、有効があるべきかどうかをチェックする方法することができます。
function P(name, age, job) {
this.name = name
this.age = age
this.job = job
if(typeof this.sayName != 'function') {
P.prototype.sayName = fucntion() {
console.log(this.name)
}
}
}
let p = new P('tc', 23, 'web')
p.sayName() // tc
sayName()メソッドは、プロトタイプに追加する前に存在していない場合にのみ、上記のコード。最初の呼び出し機能が実行されるだけで、このコード。プロトタイプの後、さらに変更を加えることなく、初期化されています。プロトタイプに行わこのような改変は、全ての場合に直ちに反映させることができます。初期化後の任意の追加のプロパティやメソッドif文のチェックが存在することができます。
注意:ダイナミックプロトタイプモードを使用する場合、あなたは、オブジェクトリテラルの書き換えプロトタイプを使用することはできませんプロトタイプを書き換えた場合のインスタンスを作成されている場合、それは既存および新規のプロトタイプ・インスタンス間のリンクを解除されます。
8.スプリアスモードのコンストラクタ
関数を作成し、その関数は、パッケージのコードは、オブジェクトを作成するときにのみ行い、その後、新しく作成されたオブジェクトを返します。
注:コンストラクタプロトタイプ性寄生モードの間には何の関係は、オブジェクトコンストラクタを返すか、コンストラクタに存在しない、つまり、オブジェクトとオブジェクトのコンストラクタ戻るコンストラクタは全く異なるが作成されていない外。この目的のために、instanceofを操作者が決定することができるオブジェクトのタイプに依存することはできません。
9.コンストラクタセキュアモード
そのようなオブジェクトのためのオペレータが意味を持たないのinstanceofので、同様の寄生コンストラクタモードは、セーフモードとコンストラクタコンストラクタを使用して作成されたオブジェクトの間には関係ありません。
公共入札少数へようこそ注意[学生]
再学習シリーズJS
=>データ型(上)再学習JSはJavaScriptの基本的な考え方
再学習のjsのJavaScript(中)=>演算子の基本的な考え方
JSはJavaScript(下)=>演算子の基本的な概念を再学びます
jsはJavaScriptの変数、スコープとメモリの問題を再学びます
ES6はシリーズ入門ガイド
Gitのチュートリアル