javascript対象の三つの特徴に向けたパッケージの実例を詳しく説明します.

6163 ワード

本論文の実例は、javascriptのオブジェクト指向の三つの特徴のパッケージを述べている.皆さんに参考にしてあげます.具体的には以下の通りです.
パッケージ
パッケージ:オブジェクト内部のデータと操作の詳細を隠します.多くの対象言語はパッケージの特性をサポートしており、キーをprvateのように提供して、いくつかの属性と方法を隠す.パッケージされたオブジェクトのデータにアクセスするには、専用の外部インターフェースを使用することができます.このインターフェースは一般的に方法です.この方法を呼び出してオブジェクト内部データを取得することができます.
JavaScript言語では専用の情報パッケージのキーワードは提供されていませんが、クローズドパッケージを使用して作成することができます.オブジェクト内部からのアクセスのみが可能です.また、インターフェースはデータパッケージのツールでもあり、インターフェースは外部からのアクセス方法の約束を提供しています.アプリケーション開発においては、すべての種類はインターフェースを定義し、クラスは外向のみに実装されたインターフェースに規定された方法を提供し、他のいかなる方法も隠すべきである.そのすべての属性は私有であり、外部はインタフェースで定義されたアクセス操作によってしか対処できない.
---「jQuery開発は入門から精通まで」から引いていますが、原書に間違いがあったり、海賊版を間違って買ったかもしれませんが、下のコードは全部私が修正したものです.大丈夫です.
パッシブ
パッケージング:対象内部データに対して適切な約束をすることで、このような約束は強い主観性を持っています.強制的な保証はなく、主に公共の対象に対してです.一般的には、JavaScriptに含まれているデータは公開されており、プライバシーがないため、情報は自由にアクセスできます.次の例を示して説明する.

var Person = function (name,gender) {
 if(name === undefined) {
 throw new Error("name is necessary")
 } else {
 this.name = name;
 }
 if(gender === undefined) {
 throw new Error("gender is necessary")
 } else {
 this.gender = gender;
 }
}
var p = new Person("Tom",1); //           ,         ,     

データの安全のために、コードの中で適切にいくつかの条件の制限を増加して、不法な情報の侵入を免れます.

var Animal = function (species) {
 if(!this.checkSpecies(species)) {
 throw new Error('species is illegal');
 } else {
 this.species = species;
 }
}
Animal.prototype = {
 checkSpecies:function(species){
 //    species ,     species ,     true ,          
 //           true
 return true;
 }
}
var ani = new Animal("dog");

より安全かつ拡張の観点から、すべてのクラスは、インターフェースを定義する必要があります.データのアクセスがより安全であり、チームの協力にも便利です.内部プライベート方法の検出とインターフェース対策は、オブジェクト内部データをある程度保護することができますが、それらは致命的な脆弱性も存在します.(これらの属性と方法は公開リセットされ、公開されたカバー属性と方法値に対して、誰もこのような行為を阻止することができません.)

var Util = function() {};
Util.prototype = {
 _say:function(){
 console.log("           _say  ");
 }
}
//         
Util.prototype._say = function(){
 console.log('  ,       ');
}
//     
var util = new Util;
util._say(); //   ,       

同時に内部検出とインターフェースはある程度システムオーバーヘッドを占有することができ、この問題も真剣に考慮しなければならない.
上のコードのように、一般的に私達は公共と私有メンバーを区別することを約束しました.いくつかの方法と属性名の前または後に下線を引いて私有を表します.
下線の名前は俗称の命名規範で、属性と方法が内部でのみ使用されることを表しています.
以上のデータ保護方式は受動的な防御です.彼らは約束だけです.守る時だけ効果があります.主に非敏感性の内部法と属性に適用される.
自動実装
jsでは、関数にはスコープがありますので、関数内部で宣言された変数は、関数の外部にアクセスできません.したがって、プライベートと共有の違いは、オブジェクトの外部にアクセスできるかどうかにある.従ってパッケージを実現するための最適な選択は関数を用いた作用領域である.例:

function haha() {
 var n = 1;
 function hehe() {
 n++;
 }
 hehe();
 return n;
}
console.log(haha()); // 2

関数hahaの内部にはプライベート変数nがあり、このスコープではheheはnにアクセスできますが、hahahaの外部のいかなる関数もhahaのnにアクセスできません.
同じように、私たちは関数内部でheheheを返します.外部でhahahaのプライベート関数heheheを呼び出すことができます.

function haha() {
 var n = 1;
 function hehe() {
 return ++n;
 }
 return hehe;
}
console.log(haha()()); // 2

関数作用領域内部の方法は外部からアクセスできないが、関数作用領域内部の他の共通方法はそれらにアクセスでき、したがって、パブリック方法を中継局として利用することで、内部プライベート方法を巧みに公開することができる.これらの公的な方法は特権的な方法とも言われています.つまり、方法の前にthisというキーワードをつけます.
このようにして作成されたオブジェクトは、以下のような真のパッケージ性を有する.

function A() {
 //      _xx
 function _xx(){}
 //     
 this.xx = function() {
 return _xx;
 }
}
A.prototype = {
 other:function() {
 console.log("other                   ,       ");
 }
}

しかし、この方法にはいくつかの欠点があります.
①新規に生成した各インスタンスオブジェクトは、コンストラクタ内の属性と方法をコピーし、プライベートの_xxは毎回実用化する時に必ず繰り返しコピーします.このように大量のメモリを使うので、大量に使うには適しないです.必要な時だけ適当に使います.
②不都合なクラスの継承は、派生したすべてのサブクラスが超クラスの私有属性と方法にアクセスできません.しかし、特権的な方法を使用して、スーパークラスのプライベート属性と方法にアクセスすることができます.例を挙げます

// B    
function B() {
 var _private = 1;
 function _checkPrivate() {
 return _private;
 }
 this.checkPrivate = function() {
 return _checkPrivate;
 }
}
// C     
function C() {
 B.call(this); //  call      ,           
 // this.private = _private; //              ,      ,   
}
//        C
var c = new C();
// console.log(c.private); //   C       ,      ,  
//                     
console.log(c.checkPrivate()()); // 1

静的方法
オブジェクト指向プログラミングにおいて、多くの方法および属性はクラスの実例と関連付けられている.もう一つの場合、静的属性および方法は、クラス自体に直接的に関連しており、クラスから直接アクセスすることができ、すなわち、クラスではなく、クラスで静的なメンバが動作する.JavaScriptのMathとGlobalは静的なオブジェクトで、実用化を必要とせずに直接アクセスできます.
クラスの静的メンバは、プライベートと公開の2つを含む.彼らはシステムの中で一つのコピーしかないです.つまり彼らは複数のインスタンスに分けられないということです.関数ポインタで参照します.本にはとてもいい例があります.以下の例を挙げます.

var F = (function(){ //        F,        
 var _a = 1; //              
 this.a = _a; //           a
 this.get1 = function(){ //          get1
 return _a;
 }
 this.set1 = function(x){ //          set1
 _a = x;
 };
 return function(){ //         ,        ,    (      )
 this.get2 = function() { //   get2  
  return _a;
 };
 this.set2 = function(x) { //   set2  
  _a = x;
 };
 }
})();
//              
F.get3 = function(){ //         get3
 return get1(); //          F      get1
}
F.set3 = function(x) { //         set3
 return set1(x); //  get1
}
//       
var f = new F(); //       
console.log(f.get2()); // 1            get2
F.set3(3); //       set3
console.log(F.get3()); // 3
F.A = ++a; //         A
console.log(F.A); // 2

このような閉め切ったパッケージを使う方法を勧めます.
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます.http://tools.jb51.net/code/HtmlJsRun上記コードの運転効果をテストします.
JavaScriptの関連内容については、当駅のテーマを見ることができます.「javascript対象入門教程」、「JavaScriptエラーとデバッグ技術のまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptアルゴリズムとテクニックのまとめ」及び「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます.