javascriptつぶやき(対象に向かってメモ)

8660 ワード

対象:JavaScriptでは、対象は二つに分けられます.
一つは「普通のオブジェクト」とも言える、数字、日付、ユーザーがカスタマイズしたオブジェクト(例えば:③)などです.
もう一つは「方法の対象」と呼ばれるもので、私たちが通常定義している機能です.
カスタムオブジェクト:
JavaScript Object Notation(略称JSON)と呼ばれる形式で、中国語に訳せば「JavaScriptオブジェクト表示法」です.    JSONは作成対象に非常に簡単な方法を提供した.例えば、    属性のないオブジェクトを作成します.
    var o={}
メソッドオブジェクト:
第一の書き方
function MyFunc() {};         //       
    var anObj = new MyFunc();  //  new   ,  MyFun  ,        
第二の書き方
function MyFunc(){};
    var anObj = {};     //      
    MyFunc.call(anObj); // anObj    this    MyFunc  
JavaScriptを理解するには、まずnewオペレータでオブジェクト(anObj)を作成し、続いてこのオブジェクト(anObj)をthisパラメータとして後方の関数(MyFun()を呼び出した.
プロトタイプタイプ:
各メソッドオブジェクトが作成されると、自動的にプロトタイプという属性を持つようになります.この属性は特に何もありません.他の属性と同じようにアクセスできます.ただし、私たちはnewキーワードでオブジェクトを作成すると、その値(オブジェクトでもある)に含まれるすべての属性が、新しく作成されたそのオブジェクトにコピーされます.
prototypeは、同じグループのオブジェクトが属性と方法を共有するメカニズムを提供してもよい.
以下は一例です.
   function Person(name)
    {
        this.name = name;   //      ,            
    };
    
    Person.prototype.SayHello = function()  // Person   prototype  SayHello  。
    {
        alert("Hello, I'm " + this.name);
    }

    var BillGates = new Person("Bill Gates");   //  BillGates  
    var SteveJobs = new Person("Steve Jobs");   //  SteveJobs  

    BillGates.SayHello();   //  BillGates       SayHello  
    SteveJobs.SayHello();   //  SteveJobs       SayHello  

    alert(BillGates.SayHello == SteveJobs.SayHello); //         prototype SayHello,    :true
引き継ぐ
プロトタイプモデルはオブジェクトのメンバを定義するためにコンストラクタが必要であるが,方法はこのコンストラクタのプロトタイプに依存している.大体の書き方は以下の通りです.
//      
    function Person(name)
    {
        this.name = name;   //          
    };
    //          prototype 
    Person.prototype.SayHello = function()
    {
        alert("Hello, I'm " + this.name);
    };    
    //      
    function Employee(name, salary)
    {
        Person.call(this, name);    //        
        this.salary = salary;       //     
    };
    //                    prototype  ,       
    Employee.prototype = new Person()   //    prototype   ,            !
    
    //              
    Employee.prototype.ShowMeTheMoney = function()
    {
        alert(this.name + " $" + this.salary);
    }; 
    var SteveJobs = new Employee("Steve Jobs", 1234);
    SteveJobs.SayHello();
    SteveJobs.ShowMeTheMoney();
 
プロトタイプモデルは、本物のプライベート変数をシミュレートすることはできませんが、2つの部分に分けてクラスを定義します.ただし、対象間の方法は共有であり、ゴミ回収の問題に出会わない上に、性能は「クローズド」モデルより優れています.「失うものは必ずある」ということですね.
    プロトタイプモデルでは、クラス継承を実現するためには、まず、サブクラス構造関数のプロトタイプを親タイプのオブジェクトインスタンスに設定しなければならない.この親のオブジェクト例を作成する目的は、上位層のプロトタイプ方法を共有するためにプロトタイプチェーンを構成することです.この例のオブジェクトを作成すると、上位構造関数もオブジェクトのメンバーを設定します.これらのオブジェクトのメンバーは継承には意味がありません.私たちも構造関数にパラメータを伝達していませんが、確かにいくつかの無駄なメンバーを作成しました.その値はundefinedですが、これも無駄です.
var anObject=new aFunct()の形でオブジェクトを作成する過程は実際に3段階に分けられます.
第一歩は新しいオブジェクトを作成することです.
第二ステップは、オブジェクトに内蔵されたプロトタイプオブジェクトをコンストラクタprototype参照のプロトタイプオブジェクトに設定します.
第3ステップは、オブジェクトをthisパラメータとして構造関数を呼び出し、メンバー設定などの初期化作業を完了する.
オブジェクトが作成された後、オブジェクト上の任意のアクセスと操作は、オブジェクト自体とそのプロトタイプチェーン上のオブジェクトだけに関連しています.構造関数とはもう関係がありません.つまり、構造関数はオブジェクトを作成する際にプロトタイプオブジェクトと初期化オブジェクトの両方を紹介する役割を果たすだけです.
では、私達は自分で一つの対象を定義して、その原型に類を記述して、この原型を新たに作成した対象に設定して、対象とする類を設定してもいいですか?また、この原型の一つの方法を構成関数として、新しいオブジェクトを初期化してもいいですか?例えば、このような原型オブジェクトを定義します.
//  1
var Person =  //            
    {
        Create: function(name, age)  //       
        {
            this.name = name;
            this.age = age;
        },
        SayHello: function()  //    
        {
            alert("Hello, I'm " + this.name);
        },
        HowOld: function()  //    
        {
            alert(this.name + " is " + this.age + " years old.");
        }
    };
  
function anyfunc(){};           //        
    anyfunc.prototype = Person;     //          prototype
    var BillGates = new anyfunc();  //                    
コード2
var o = {}; //         。   
o.eat = function(){return "I am eating."}  //       ;   
o.sleep = function(){return "ZZZzzz..."}  //       ;   
o.talk = function(){return "Hi!"} //        ;   
o.think = function(){return "Hmmm..."} //         。   
  
var Human = new Function(); //         “ ”。   
Human.prototype = o; //           “ ”   。   
 
var h = new Human(); //              ,   
alert(h.talk()) //        “ ” !
Javascriptのモジュールモード
グローバル変数は悪魔です.YUIの中で、私達は二つのグローバル変数しか使いません.YAHOOとYAHOO_configYUIのすべてはYAHOO対象クラスのメンバーやそのメンバーの役割領域内の変数を使用しています.あなたのアプリケーションでも同様のルールを使うことを提案します.
  • は、YUIを使えば、YAHOO.namespace()の方法で、空きmyProjectオブジェクトが割り当てられています.YAHOOのメンバーです.今からYAHOO.myProjectのメンバーを追加することができます.
  • はあなたの名前空間オブジェクトに匿名関数の戻り値を割り当てます.
    YAHOO.myProject.myModule = (function () {
        return  {
          myPublicProperty: "   YAHOO.myProject.myModule.myPublicProperty   。";
          myPublicMethod: function () {
          YAHOO.log("   YAHOO.myProject.myModule.myPublicMethod   。");
        }
    };
    })(); 
    はjqueryがどのようにしているかを てみましょう. 
         (function() {
                Me = function() {
                    return new Me.prototype.init();
                }
                Me.fn= Me.prototype = {
                    init: function() {
                        return this;
                    },
                    showname: function() {
                        alert("Jane");
                    },
                    showage: function() {
                        alert(Infinity);
                    }
                }
                Me.fn.init.prototype = Me.fn;
            })();
            Me().showname();
            Me().showage();
  •  
  • var jQuery = window.jQuery = window.$ = function(selector, context) { 
    return new jQuery.fn.init(selector, context);
    }
    のコード①は、 のjQuery ではなく、jQuery.fn.init で されたオブジェクトを ることができます.jQueryの はjQuery.fn.initの です.jQuery.fn=jQuery.prototype={.}. たちは にはnew jQuery(xx)ではなく、 jQuery(xx)を しています. はjQuery の となり、 の のものを して ります.jQuery の も てました.jQuery.prototypeに を する は きくないことが かります.new jQuery(xx)を するのは が いということも かります.jQuery.fn.initはjQuery.fn.initを じて( って)jQuery.fnです.を します