jsは対象に向かういくつかの小さい練習.

5240 ワード

今日は相手に向けてjsの練習をします.無駄話は多くなくて直接練習します.もしこの練習をすれば、jsの対象についての知識はもうはっきりしました.
一、コード

        function Foo(){
            getName = function(){
                alert(1);
            };
           return this;
        }

        Foo.getName = function (){alert(2);};
        Foo.prototype.getName=function () {alert(3);};
        var getName = function (){ alert(4);};
        function getName(){alert(5);}


//        

        // 1 Foo.getName(); 
        // 2 getName(); 
        // 3 Foo().getName(); 
        // 4 new Foo.getName(); 
        // 5 new Foo().getName(); 
        // 6 new new Foo().getName(); 
どうですか?答えはもう分かりましたか?
二、具体的な分析
1.Foo.getName()ポップアップ2分析:これは簡単で、Foo.getName関数式を直接実行するべきです.
2.get Name()その結果4、これは分析しにくいです.ここにはいくつかの知識点があります.詳しく説明します.①変数名(賦値がない場合)と関数名が同じ場合、関数を優先的に読み込むということです.
var getName
function getName(){alert(5);}

getName();  //    5
3.Foo().getName();結果1
この知識点が多いので、ゆっくり分析します.
Foo()関数が実行された時、Foo()関数からthisが戻ってきました.実行が終わると、Foo関数内のデータが大域的な環境に露出されてしまいますので、戻るthisつまりFoo()はwindowです.windowの下でName関数が二つあると言いますか?
getName = function(){
                alert(1);
            };

var getName = function (){ alert(4);};
なぜ4がポップアップされないかというと、var宣言の変数がアップグレードされていません.var宣言の変数がアップグレードされていません.2番目に、関数の中でvar宣言の変数が使用されると、その作用領域は関数内にあります.ここでは、var宣言でgetName関数式がないので、Foo()getName()の結果は1です.
4.new Foo.getName()結果2
この結果はあなたが正しいと思っているかどうか分かりません.この結果に対してまずnew操作子の背後に何があるかを知る必要があります.前の文章を見てもいいです.http://blog.csdn.net/webxiaoma/article/details/65937768
newオペレータを使ってオブジェクトを作成する時、その後ろに私達に作ってくれる仕事は似ています.
var obj1= (function(){
    var o={}; //       
    o.__proto__=obj.prototype; //          obj   
    obj.call(o,"hello")  //  obj  , o      obj  , o   obj        (  )
    return o;
})()
ここでnewから出た構造関数は、インスタンスの原型の上のすべての属性と方法を継承します.ここで弾いたのは、①newオペレータが実行中にコール関数(またはappy関数)を実行し、Foo.getName()がnewにオブジェクトを作成する際にその内部で実行したからです.ここでこのように書いたらnew Foo.getNameもポップアップします.
②ここで生成されたコンストラクタはFoo.getNameのコンストラクタであり、もし信じられないなら、自分で手動でFoo.getNameのプロトタイプに属性または方法(例えば、Foo.get Name.prototype.name=4)を追加し、作成したコンストラクターを利用してアクセスさせることができる.
var ac = new Foo.getName();   
console.log(ac.name) // 4
5.new Foo().getName()結果は3です上の結果が読めば、これは分かりやすくなります.ここで上と唯一の違いは、関数Fooに括弧を付けたことです.この違いは構造関数の例を変えました.上で構成された関数の例はFoo.getNameです.この構造関数の例はFooです.ここのnew Foo().getName();の書き方は、実は以下の通りです.
var a = new Foo();
a.getName();
以上は私の分析の過程です.何か間違いや問題があれば、メッセージを歓迎します.