Javascript上級技術編(2):対象に向けた理解を深める

28282 ワード

Javascriptは対象に向けた言語とよく言われます.つまり対象に向けた基本的な特性を持っています.例えば、オブジェクト、クラス、属性、方法、コンストラクションなどの基本的な要素が含まれています.実はとても簡単で、一つのfunctionです.いわゆる「簡単は美」です.カスタムクラスでは、JSベースのクラス:Math,Aray,ObjectおよびStringなどを振り返ってみます.
//  JS      (         )

function EmailMessage() { 

}

var EmailMessage = function() { 

}
クラスがあるとオブジェクトが存在します.同時にコンストラクションも生まれます.構造関数では、現在のオブジェクトに属する属性または方法に対して、this.**を使用することが多い.同じクラスで生成された複数のオブジェクトの間に松が結合している場合には、互いに独立している.
//             (    )

var EmailMessage = function() {

    alert("New message created.");

}

var myMessage = new EmailMessage(); //    "New message created."

var anotherMessage = new EmailMessage(); //    "New message created."
パラメータをオブジェクトに渡すときは、参構造関数を使います.
//      

var EmailMessage = function(message) {

    alert(message);

}

//    "Return to sender"

var myMessage = new EmailMessage("Return to sender");
先ほどお話ししましたが、thisを使って属性にアクセスすることができますが、JSにはもう一つの方法で属性を追加します.prototypeを利用してください.属性を追加できるだけでなく、方法も追加できます.
//  this             

var EmailMessage = function(subject) {

    this.subject = subject; 

    this.send = function() {

        alert("Message '" + this.subject + "' sent!");

    }

}

var myMessage = new EmailMessage("Check this out...");

var anotherMessage = new EmailMessage("Have you seen this before?");

//       

alert(myMessage.subject); //    "Check this out..."

alert(anotherMessage.subject); //    "Have you seen this before?"

myMessage.send();//    "Message 'Check this out...' sent!"

anotherMessage.send();//    "Message 'Have you seen this before?' sent!"
prototypeを利用して属性と方法を追加する(主に既存のクラスを機能拡張するのに適している).
var EmailMessage = function(subject) {

    this.subject = subject; 

}

//  prototype     

EmailMessage.prototype.send = function() {

    alert("Message '" + this.subject + "' sent!");

}

var myMessage = new EmailMessage("Check this out...");

var anotherMessage = new EmailMessage("Have you seen this before?");

//       

alert(myMessage.subject); //    "Check this out..."

alert(anotherMessage.subject); //    "Have you seen this before?"

myMessage.send();//    "Message 'Check this out...' sent!"

anotherMessage.send();//    "Message 'Have you seen this before?' sent!"
普通友達が言います.JS類は一つの対象しか存在しないという場合、いわゆるシングルモデルはどうやって実現されますか?実はJSの内蔵類には多くの単例が含まれています.例えば、Mathなどです.ここでは、二つの実現方法を提供します.
var User = function() {

    this.username = "";

    this.password = "";

    this.login = function() {

        return true;

    }

}

//   User               ,         (           )

User = new User();

//               (   C#     )

User.login();
もう一つの実施形態は、「自己初期化」である.すなわち、クラス声明の時に直ちに実行され、このクラスは一つのオブジェクトだけを含む.
var Inbox = new function() {

    this.messageCount = 0;

    this.refresh = function() {

        return true;

    }

}();

//       

Inbox.refresh();
次に、既存のカテゴリーに加えて、新たな機能を追加して拡張を実現します.これを「継承」と呼びます.以下のコードの明るいセグメントに注意してください.
var EmailMessage = function(subject) {

    this.subject = subject;

    this.send = function() {

        alert("Message '" + this.subject + "' sent!");

    }

}

//         

var EventInvitation = function() {};

//      EmailMessage      

EventInvitation.prototype = new EmailMessage(); // EventInvitation          

EventInvitation.prototype.constructor = EventInvitation; //          subject

EventInvitation.prototype.subject = "You are cordially invited to...";

//   EventInvitation   

var myEventInvitation = new EventInvitation();

//    "Message 'You are cordially invited to...' sent!"

myEventInvitation.send();
既存のクラスを継承しながら、サブクラスは親の属性と方法をすべて取得します.自身は自分に関連する属性と方法を定義するだけです.パッケージと多形の概念を説明します.すなわち、各クラスは自分自身に関連する属性と方法だけに注目します.多形とは、サブクラスが親の同名属性または方法を含む場合、父親から同名の要素を継承したくない場合、サブクラスは、この要素を再定義することができる(subjectなど).
var EmailMessage = function(subject) {

    this.subject = subject;

    this.send = function() {

        alert("Email message sent!");

    }

}

//   EmailMessage

var EventInvitation = function() {};

EventInvitation.prototype = new EmailMessage("You are cordially invited to...");

EventInvitation.prototype.constructor = EventInvitation;

//   send  

EventInvitation.prototype.send = function() { alert("Event invitation sent!"); } var myEmailMessage = new EmailMessage("A new email coming your way.");

var myEventInvitation = new EventInvitation();

myEmailMessage.send(); //    "Email message sent!"

myEventInvitation.send(); //    "Event invitation sent!"
今は、サブクラスが親タイプを書き換える必要があると仮定して、親タイプのメソッドを呼び出す必要があります.どうやって実現するかを見てみます.
var EmailMessage = function(subject) {

    this.subject = subject;

    this.send = function() {

        alert("Email message sent!");

    }

}

//   EmailMessage

var EventInvitation = function() {};

EventInvitation.prototype = new EmailMessage("You are cordially invited to...");

EventInvitation.constructor.prototype = EventInvitation;

//   send  

EventInvitation.prototype.send = function() {

    alert("Event invitation sent!");

    //   this.constructor.prototype            

    this.constructor.prototype.send.call(this); }

var myEmailMessage = new EmailMessage("A new email coming your way.");

var myEventInvitation = new EventInvitation();

myEmailMessage.send();//    "Email message sent!"

myEventInvitation.send();//    "Event invitation sent!"、"Email message sent!"
以上の説明から、thisの大量の応用を発見するのは難しくないです.多くの友達もthisが現在実行されている対象の実例を表していることを知っています.ここではthisの普遍的な意味と使い方を詳しく説明します.簡単なコードをあげます.結果は何ですか?主にこの時のthisは一体何を表していますか?
var showSubject = function() {

    alert(this.subject);

}

showSubject();//    "undefined"
先ほど述べましたが、thisは現在実行されているインスタンスオブジェクトを表していますが、現在は前のコードのようにクラスを定義してからオブジェクトを定義し、この定義の対象をthisで表しています.正確な説明は、thisは、その役割領域内のクラス自身または実行中のオブジェクトを表し、thisがクラスを超えた場合は、グローバルオブジェクトwindowオブジェクトを表します.したがって、undefinedを出力するべきです.次に私たちはこのfunctionを既存のEmail Messageに移植します.
var showSubject = function() {

    alert(this.subject);

}

showSubject();//   "undefined"

this.subject = "Global subject";//       

showSubject();//    "Global subject"

//   EmailMessage 

var EmailMessage = function(subject) {

    this.subject = subject;

}

//  showSubject   EmailMessage,    showSubject  ()

EmailMessage.prototype.showSubject = showSubject;

var myEmailMessage = new EmailMessage("I am the subject.");

myEmailMessage.showSubject();//    "I am the subject.",    this  myEmailMessage

showSubject();//   "Global subject",    this   window

EmailMessage.prototype.outputSubject = function() { //   EmailMessage     outputSubject   showSubject

    showSubject();

}

myEmailMessage.outputSubject();//    "Global subject.",          , this   window
現在の参照のオブジェクトthisを強制的に切り替えたい場合は、コール、applyの2つの方法があります.両者の違いは小さく、前者が伝達するのはパラメータリストであり、後者が伝達するのはパラメータ配列である.
var showSubject = function() {

    alert(this.subject);

}

var setSubjectAndFrom = function(subject, from) {

    this.subject = subject;

    this.from = from;

}

//this      window

showSubject(); //   "undefined"

setSubjectAndFrom("Global subject", "[email protected]");

showSubject(); // Outputs "Global subject"

//  EmailMessage 

var EmailMessage = function() {

    this.subject = "";

    this.from = "";

};

var myEmailMessage = new EmailMessage();

//call apply this     window   myEmailMessage

setSubjectAndFrom.call(myEmailMessage, "New subject", "[email protected]"); setSubjectAndFrom.apply(myEmailMessage, [ "New subject", "[email protected]" ]); showSubject.call(myEmailMessage);//   "New subject"
ここまで、私たちが定義した属性と方法は、クラスの外部でアクセスできます.もしいくつかの属性と方法をクラスの内部だけに使ってもいいです.いわゆるprvate変数をどうやって実現しますか?
var EmailMessage = function(subject) {

    //         

    this.subject = subject;

    this.send = function() {

        alert("Message sent!");

    }

    //         (  var   this)

    var messageHeaders = "";

    var addEncryption = function() {

        return true;

    }

    //         (             ,     )

    var messageSize = 1024;

    this.getMessageSize = function() {

        alert(messageSize);

    }

}
次にこれらの変数を使い始めます.彼らの表現はどうですか?
var myEmailMessage = new EmailMessage("Save these dates...");

alert(myEmailMessage.subject); //    "Save these dates..."

myEmailMessage.send(); //    "Message sent!"

//   "undefined"  messageHeaders     

alert(myEmailMessage.messageHeaders);

// addEncryption()     ,            

try {

    myEmailMessage.addEncryption();

} catch (e) {

    alert("Method does not exist publicly!");

}

//   "undefined"  messageSize     

alert(myEmailMessage.messageSize);

//   "1024",              

myEmailMessage.getMessageSize();
以上の学習を通じて、皆さんは対象に向けた基礎知識点をすでに知っていますよね.次に、最後に「対象文字数(Object Literal)」について簡単に話します.よく人の話を聞きますが、その相手の字面の量は何ですか?簡単に言えば、一連の属性と方法を組み合わせた集合体が、単一のオブジェクト(Singleton)を作成し、クラスを作成し、関数入力パラメータなどを設定するために使用されます.これから説明します.まず、対象の字面量は変数であり、その後、すべての属性と方法を「キーパッドペア」という形で全部含んでいます.これは後のシリーズのJSONデータ組織フォーマットと似ています.
var earth = {

    name: "Terra Firma", //    

    planet: true, //     

    moons: 1, //   

    diameter: 12756.36, //   

    oceans: ["Atlantic", "Pacific", "Indian", "Arctic", "Antarctic"], //   

    poles: { //        

        north: "Arctic",

        south: "Antarctic"

    },

    setDiameter: function(diameter) { //   

        this.diameter = diameter; //   this  earth

    }

}

//

alert(earth.diameter); //    "12756.36"

earth.setDiameter(12756.37);

alert(earth.diameter); //    "12756.37"
同じ対象の字面量でもクラスを作成できます.
var EmailMessage = function() {};

EmailMessage.prototype = {

    subject: "",

    from: "",

    send: function() {

        alert("Message sent!");

    }

}

var myEmailMessage = new EmailMessage();

myEmailMessage.subject = "Come over for a party.."

myEmailMessage.send(); //   "Message sent!"
その相手の文字の量はどのように関数としての入力パラメータですか?簡単です.私たちは時々伝達する入力パラメータが多すぎると、これらのパラメータの間にまた関連があります.オブジェクトの字面量を入力パラメータとして使用してもいいです.
//         

var sendEmail = function(to, from, subject, body) {

    alert("Message '" + subject + "' from '" + from + "' sent to '" + to + "'!");

}

//         

sendEmail("[email protected]", "[email protected]", "Dinner this week?", ?

"Do you want to come over for dinner this week? Let me know.");

//              ( 4    1 )

var sendEmail = function(message) {

    alert("Message '" + message.subject + "' from '" + message.from + "' sent to '" + message.to + "'!");

}

//

sendEmail({

    from: '[email protected]',

    to: '[email protected]',

    subject: 'Dinner this week?',

    body: 'Do you want to come over for dinner this week? Let me know.'

});
もっと柔軟で便利に使えると思いますか?改めて上記の話題に戻ります.変数の役割領域は、実はこれは皆さんの日常の実際のプロジェクト経験の中でもっと重視すべきですか?Windowsはグローバルスコープで有効だと言いましたが、JSプログラムが多すぎたり不適切にグローバル変数を使用したりすると、グローバルスコープ内に多くのグローバル変数が存在し、アプリケーションの安全性に大きな挑戦を与えます.一部の心機があるハッカーにとって、勝手に他の人にグローバル変数を取得させ、悪意のある修正をさせて、アプリケーションの崩壊を招きます.どうやって効果的に避けられますか?私の提案:プライベート変数を採用して私達の秘密データを保護してもいいです.その次に名前空間を採用してモジュールレベルを確立して合理的な保護を達成できます.
//   MyCompany      Singleton

var MyCompany = new function(){

    this.MyClient = { 

        WebMail: function() {

            alert("Creating WebMail application...");

        }

    };

}(); 

//    "Creating WebMail application..."

var myWebMail = new MyCompany.MyClient.WebMail();
これまでJSの対象向け知識点についてはここまで紹介してきましたが、今後のシリーズではJavascriptの性能向上とテストフレームワークの構築についても説明します.