javascript快速入門12ーー関数式と対象向け

25927 ワード

関数
関数は、いつでもどこでも実行できるフレーズのセットです.
関数はECMAScriptの中心です.
関数の作成
    function fnOne() {//       ,              
        //        
    }
var fnTwo = function () {// };
function () {// }
(
function fnThree() { })();//
(function () {})();//
 
匿名関数と命名関数の違い
    fnOne();//    ,  function                           
    fnTwo();//  
    var fnTwo =function () {};//              ,fnTwo     
    function fnOne() {}
 
関数の戻り値
    function fnTest() {
        return "value";//  return    
        alert("Hello!!!");//   return  ,       
    }
 
関数のパラメータ
    function fnTest(arg1,arg2,arg3) {
        alert(arg1+"
"+arg2+"
"+arg3); } fnTest(1,2,3); fnTest(1,2);// , undefined
 
argmentsオブジェクト:関数実行時に関数内部にargmentsオブジェクトがあります.すべてのパラメータを含んでいます.argmentsのlength属性は着信パラメータの個数を報告しています.
    function fnTest() {
        for (var i=0;i< arguments.length;i++) {
            alert(arguments[i]);
        }
    }
    fnTest(1,2,3);
    fnTest(45);
 
argmentsオブジェクトシミュレーション関数を使って再負荷します.
    function fnTest() {
        var args = arguments;
        switch (arguments.length) {
            case 0 :
                return "    !!!";
            case 1 :
                return "    :"+args[0];
            case 2 :
                return "    :"+args[0]+"   "+ args[1];
        }
    }
    alert(fnTest());
    alert(fnTest(1));
    alert(fnTest(2));
 
argmentsオブジェクト追加:argmentsオブジェクトのcalee属性は、その関数を指します.
    function fnTest() {alert(arguments.callee);}
 
包みを閉じる
クローズドとは、用語表現が計算されない変数を含む関数、すなわち関数以外の変数を使用することができます.
ECMAScriptでグローバル変数を使うのは簡単なクローズド・インスタンスです.次のコードを考えてください.
    var msg = "      !!!";
    function say() {
      alert(msg);
    }
    say();
 
ECMAScriptでは、関数宣言で関数の外部に見られる宣言のすべての変数が、関数内部でそれらの最終値にアクセスできます.
    var g = "    !!!";
    function fnA() {
        var a="A";
        function fnB() {
            var b="B";
            alert(a);//     a
            alert(c);//     c
            function fnC() {
                var c = "C";
                alert(a+"
"+b);// } } } // function fnTest(num1,num2) { var num3 = num1+num2; return function () { alert("num1+num2 "+num3); }; } var result = fnTest(23,56); result();
 
クローズド関数は変数の最終値にのみアクセスできます.
    function fnTest(arr) {
        for (var i=0;i < arr.length;i++) {
            arr[i]=function () {
                alert(i+" | "+arr[i]);
            };
        }
    }
    var arr = [0,1,2,3,4,5];
    fnTest(arr);
    for (var i=0;i < arr.length;i++) {
        arr[i]();//    6    undefined
        //       ,i  6,         6
    }
 
クローズドでは、クローズド以外の変数値にアクセスできるだけでなく、その値を設定することもできます.
    function fnTest() {
        var a=123;
        return {
            set:function (param) {a = param},
            get:function () {return a}
        };
    }
    var obj = fnTest();
    alert(obj.get());//123
    obj.set(4);
    alert(obj.get());//4
 
オブジェクト、コンストラクタ
オブジェクトを作成
    var obj = new Object();
    alert(obj);
    alert(Object);//    
    Object();//      
    //             
    function Demo() {
    }
    var d = new Demo();//    ,  new          
    alert(d);//object
 
thisキーワードの使い方
    function Demo() {
        this.property = "  !!!";
    }
    d = new Demo();
    alert(d.property);//  !!!
 
newを使わずに構造関数を直接実行する場合、thisはwindowを指します.
   function Demo() {
        this.property = "  !!!";
    }
    var d = Demo();
    alert(d.property);//undefined
    alert(window.property);//  !!!
 
構造関数にパラメータを伝達し、オブジェクトの属性にパラメータを割り当てることができます.
    function Person(name,age) {
        this.name = name;
        this.age = age;
    }
    var p1 = new Person("CJ",18);
 
instance of演算子は、オブジェクトがあるクラスかどうかを判断するために使用されます(ECMAScriptにはクラスが存在しませんが、ここではまだこの用語を使用します).
    var str = new String("string");
    alert(str instanceof String);//true
    var arr = new Array();
    alert(arr instanceof Array);//true
    function Demo() {}
    var d = new Demo();
    alert(d instanceof Demo);//true
 
オブジェクト指向語
オブジェクト指向の言語は開発者に4つの基本的な能力を提供する必要があります.
  • は、関連情報(データまたは方法に関係なく)をオブジェクトに格納する能力をパッケージ化する.
  • は、一つのオブジェクトを別のオブジェクトに格納する能力を集めている.
  • は、他のクラス(または複数のクラス)によって分類される属性および方法を継承する能力を有する.
  • 多状態――様々な方法で動作できる関数または方法を作成する能力.
  • ECMAScriptはこれらの要求をサポートしていますので、対象として見られます.
    パッケージとプライベート属性:パッケージはプライベートを要求しません.
        function Person(name,age) {
            this.name = name;//              
            this.age = age;
        }
        var p1 = new Person("CJ",18);
     
    ECMAScriptは現在のバージョンではプライベート属性はサポートされていませんが、クローズドでシミュレーションできます.
        function Person(name,age) {
            this.getName = function () {return name};
            this.setName = function (param) {name=param};
            this.getAge = function () {return age};
            this.setAge = function (param) {age=param};
        }
        var p1 = new Person("CJ",18);
        alert(p1.name);//undefined
        alert(p1.getName());//CJ
        p1.setName("XXX");
        alert(p1.getName());//XXX
     
    継承:prototype属性
    ECMAScriptでは、構造関数のprototype属性によって継承が実現されます.
        function Person(name,age) {
            this.name=name;
            this.age = name;
        }
        alert(Person.prototype);//object
        Person.prototype.sort = " ";
        var p1 = new Person("CJ",18);
        alert(p1.sort);//   Person        sort    
     
    すべてのオブジェクトには他のオブジェクトの原型かどうかを判断する方法があります.
        function Person() {}
        var p1 = new Person();
        alert(Person.prototype.isPrototypeOf(p1));//true
     
    ECMAScriptでは、一つのクラスに別のクラスを引き継ぐ方法が特殊です.
        function ClassA() {
            this.a = "A";
        }
        function ClassB() {
            this.b = "B";
        }
        ClassB.prototype = new ClassA(); // ClassB  ClassA
        var b = new ClassB();
        alert(b.a);//"A",     a
        alert(b instanceof ClassB);//true
        alert(b instanceof ClassA);//true,    ,b  ClassA   
        alert(ClassB.prototype.isPrototypeOf(b));//true
        alert(ClassA.prototype.isPrototypeOf(b));//true,ClassA.prototype  b   
     
    しかし、このような継承には注意点があります.
        function ClassA() {
            this.a = "A";
        }
        function ClassB() {
            this.b = "B";
        }
        var b = new ClassB();//    ClassB
        ClassB.prototype = new ClassA();//    ClassA, prototype        
        alert(b instanceof ClassB);//false
        alert(b instanceof ClassA);//false
        alert(ClassB.prototype.isPrototypeOf(b));//false
        alert(ClassA.prototype.isprototypeOf(b));//false
     
    コンストラクタがパラメータを必要とするとき
        function Person(name,age) {
            this.name = name;
            this.age = age;
        }
        function Teacher(name,age,lesson) {
            this.tempMethod = Person;//    
            this.tempMethod(name,age);
            //   Person ,    Teacher        ,   Person    this   Teacher   
            delete this.tempMethod;//      
            this.lesson = lesson;
        }
        ClassB.prototype =new ClassA();//           
        var t1 = new Teacher("HUXP",18,"C#");
        alert(t1.name+" | "+ this.age+ " | "+this.lesson);
     
    実際には、ターゲットに対して、ECMAScriptはより簡潔な内蔵方法のcallを提供しています.各関数で呼び出します.最初のパラメータは偽者の対象です.残りは関数が必要な他のパラメータです.
        function Demo(arg) {
            this.name = arg;
        }
        var obj = new Object();
        Demo.call(obj,"name");
        alert(obj.name);//"name"
        //  call         
        function Person(name,age) {
            this.name = name;
            this.age = age;
        }
        function Teacher(name,age,lesson) {
            Person.call(this,name,age);//    
            this.lesson = lesson;
        }
     
    静的属性とFunctionクラス
    ECMAScriptには、関数自体もオブジェクト(配列と同じ)であり、newを使って作成することもできます.Functionコンストラクタは、少なくとも2つの文字列パラメータを伝えます.空の文字列でもいいです.最後の文字列以外は関数文として実行されます.他のパラメータは関数変数名として使用されます.
        var fn = new Function();//     
        //        
        fn = new Function("arg1","alert(arg1)");//
        //        
        fn = function (arg1) {alert(arg1)};//  ,        ,         
        fn.property ="     ,         "
     
    実際には、構造関数に加えられた属性は静的属性と呼ばれ、実例によって継承されない.
        function ClassDemo() {
        }
        ClassDemo.property = new Array();
        var d =new ClassDemo();
        alert(d.property);//undefined
        alert(ClassDemo.property);//object
     
    Functionクラスの例は他にもいくつかの方法と属性があります.もちろん、functionキーワード宣言の関数も同じです.
        function outer() {
            inner();
            function inner() {
                alert(inner.caller);
                //   caller              ,    outer
            }
        }
        function applyTest() {
            var args = arguments;
            this.name = args[0];
            this.age=args[1];
        }
        var obj = new Object();
        applyTest.apply(obj,["name",18]);
        alert(obj.name);
        alert(obj.age);
        //apply   call    ,       ,  apply        
        //