JavaScript-奇妙なオブジェクトを悟る


まず関数のオブジェクト化能力についてお話しします.
いずれの関数も、単純なタイプであっても、オブジェクトであっても、他の関数であっても、属性を動的に追加または除去することができます.つまり、関数はオブジェクトのすべての特徴を持っており、関数をオブジェクトとして使用することができます.実際には、関数はオブジェクトですが、一般的なオブジェクトよりもカッコ「()」オペレータが多く、このオペレータは関数の論理を実行するために使用されます.すなわち、関数自体は呼び出されてもよいが、一般オブジェクトは呼び出されてはならず、それ以外は全く同じである.次のコードを見てください.
view plain copy to clipboard print ?
function Sing()   
{   
    with(arguments.callee)   
      alert(author + ":" + poem);   
};   
Sing.author=「李白」;  
Sing.poem=「漢家秦地月、流影照明妃.玉関道に上がると、天涯は帰らない」;  
Sing();   
Sing.author=「李戦」;  
Sing.poem=「日の出漢家天、月落陰山前.娘琵琶怨、三千年を歌いました」;  
Sing();  
    function Sing()
    {
        with(arguments.callee)
          alert(author + ":" + poem);
    };
    Sing.author = "  ";
    Sing.poem = "     ,     。     ,     ";
    Sing();
    Sing.author = "  ";
    Sing.poem = "     ,     。     ,     ";
    Sing();

このコードではSing関数が定義されると,Sing関数にauthorとpoem属性が動的に追加される.authorとpoem属性を異なる作者と詩句に設定すると、Sing()を呼び出すと異なる結果が表示されます.この例では,JavaScript関数がオブジェクトの本質であり,JavaScript言語の優美さも感じられることを詩情画意的に理解した.
さて、以上の説明では、functionタイプのものはすべてobjectタイプと同じものであることを理解しているはずです.このようなものを「対象」と呼びます.私たちは確かにこれらの「オブジェクト」をこのように見ることができます.「属性」も「方法」もあるからです.しかし、次のコードは新しい疑問を生み出します.
view plain copy to clipboard print ?
var anObject = {};//オブジェクトanObject.aProperty = "Property of object";//オブジェクトの属性anObject.aMethod = function(){alert("Method of object")};//オブジェクトの1つの方法//主に下記を見る:alert(anObject["aProperty"]);//オブジェクトは、配列が属性名を下付きとして属性にアクセスできる.
anObject["aMethod"]();//メソッドは、配列がメソッド名を下付きとして呼び出すときにオブジェクトを呼び出すことができる.
for(var s in anObject)/オブジェクトのすべての属性と方法を遍歴して反復化処理を行う    alert(s + " is a " + typeof(anObject[s]));   
同様にfunctionタイプのオブジェクトについても同様です:var aFunction = function() {};//一つの関数aFunction.aProperty = "Property of function";//関数の属性aFunction.aMethod = function(){alert("Method of function")};//関数の1つの方法//主に下記を見る:alert(aFunction["aProperty"]);//関数は、配列が属性名を下付きとして属性にアクセスできる
aFunction["aMethod"]();//関数は、配列がメソッド名を下付きとしてメソッドを呼び出すことができる
for(var s in aFunction)/関数のすべての属性と方法を遍歴して反復化処理を行う    alert(s + " is a " + typeof(aFunction[s]));  
    var anObject = {};  //    
    anObject.aProperty = "Property of object";  //       
    anObject.aMethod = function(){alert("Method of object")}; //       
    //     :
    alert(anObject["aProperty"]);   //                     
    anObject["aMethod"]();          //                     
    for( var s in anObject)           //                   
        alert(s + " is a " + typeof(anObject[s]));
        function         :
    var aFunction = function() {};  //    
    aFunction.aProperty = "Property of function";  //       
    aFunction.aMethod = function(){alert("Method of function")}; //       
    //     :
    alert(aFunction["aProperty"]);   //                     
    aFunction["aMethod"]();          //                     
    for( var s in aFunction)           //                   
        alert(s + " is a " + typeof(aFunction[s]));

はい、オブジェクトと関数は配列のように属性名またはメソッド名を下付きとしてアクセスして処理できます.では、配列なのか、それともオブジェクトなのか.
配列は線形データ構造と呼ぶべきであり,線形データ構造には一般的に一定の法則があり,統一的なロット反復操作などに適しており,波に似ていることが分かった.オブジェクトは離散データ構造であり,分散したものや個性的なものを記述するのに適しており,粒子に似ている.そこで、JavaScriptのオブジェクトは波なのか粒子なのかを聞くこともできます.
対象量子論が存在するならば、答えはきっと:波粒の二象性!
したがって,JavaScriptの関数やオブジェクトにはオブジェクトの特徴も配列の特徴もある.ここでの配列は「辞書」と呼ばれ,任意に伸縮可能な名前値ペアの集合である.実際、objectとfunctionの内部実装は辞書構造であるが、このような辞書構造は厳格で精巧な文法を通じて豊富な外観を示している.量子力学がいくつかの場所で粒子で問題を解釈し処理するように,他の場所では波で問題を解釈し処理する.必要に応じて、オブジェクトと配列のどちらで問題を説明し、処理するかを自由に選択することもできます.JavaScriptのこれらの奇妙な特性を把握するのが上手であれば、簡潔で強力なコードをたくさん書くことができます.