簡單的記錄一下JavaScript 高級應用


    我是一名.net 程序員但是由於公司需求,開發離線app,但是在工作的過程中我發現,周圍人在寫JavaScript的時候都是面向過程的編碼,對於我這.net程序員,遇到這種情況真是六神無主,但是工作中還要趕進度,於是乎我就白天工作,晚上就在別人玩游戲的時候,好好的研習了一下JavaScript的面向對象的實現方式。

    以下的講解我只簡單的說明一下,我這個項目中使用到的技術的簡單說明。

【一】

       "use strict"; 采用了嚴格模式 ,這樣寫的好處可以消除Javascript一些不合理的語法(例如:)

      

var temp = "7072547";

temp2 = "7452707";

這里面的temp2它是一個全局的變量,在使用嚴格模式的時候,會爆一個異常。詳細的內容可以看嚴格模式詳解

【二】匿名函數自調用,由於js里面沒有塊的概念,如果把變量定義在公共空間上,這樣變量就屬於一個Window 下的變量,只有當window 銷毀的時候才會銷毀空間

(function(win){
     var _win = win;
     var name = "王陽";
     var qq = "7072547";
})(window)

上面的代碼的好處是 我把window的處理當做局部對象,而在函數里面的變量都是局部變量這樣就不會占用過多的全局空間,同時方法里面命名的變量也不會與方法外面的變量命名進行沖突。

【三】這里是重點 使用了面向對象,js 面向對象可不想其他傳統語言 例如java c# 那樣 對類划分的非常的清晰,js的面向對象可以說是面向於無形,你也可以理解為此時無形勝有形,為什么這樣說那

C# 類的實現都是 都會有class 關鍵字,可是js 那!只有個function ,我剛開始寫js 的時候想用面向對象都無從下手,但辛虧我在人家玩游戲的時間,好好的研習一下JavaScript,才了解原來其實function

可以算是一個特殊的對象了。

function belle(){
      this.name;      
}

belle.display = function(){
      alert(this.name);  
}

belle.display();

上面的代碼來看函數完全有類的特性,其實上面的代碼belle就是構造函數,而display就是他的靜態方法。

如果把上面的代碼寫成這個樣子be.display()就會報錯 不是一個函數,其實是未找到這個方法。為什么那?

function belle(){
      this.name;      
}

belle.display = function(){
      alert(this.name);  
}

var be =new belle();
be.display();

在別人玩游戲的時候,好好研習了JavaScript的時候才發現,be 是對象而對象是沒有原型屬性的(prototype)對象只有__proto__ 內置屬性 和construcor。在

var be =new belle(); 實例化的時候 會把belle 函數的prototype的地址給__proto__屬性 如果 be 是個空對象 那么be下面的constructor 會指向 object,但是如果new 了之后
be下面的constructor就指向了belle();所以你在var be = new belle(); be.display() 會報找不到這個函數,因為對象在查找不到屬性的情況下會向prototype里面去查找,但是上面的
代碼函數只掛在constructor上面所以報會找不到的錯誤,上面的代碼可以這樣改寫。

function belle(){
      this.name;      
}

belle.display = function(){
      alert(this.name);  
}

var be = new belle();
be.constructor.display();

這下明白了吧!

然后就是使用prototype來實現類公共方法。下面是我之前寫的面向對象實現方式

function belle(){
    var self = this;
    self.name = "王陽";  
    self.qq = "7072547";
    self.myMethod = function()
    {
        alert("name:"+self.name+" qq:"+self.qq);
    }
}

var be =new belle();
be.myMethod();

這樣就實現了面向對象,我可以使用工廠模式等常用設計模式來改寫我們的前台代碼,由於現在web的前端代碼越來越多,這樣寫的自然好處多多,但是

仔細查看上面的代碼你們有沒有發現個問題?

什么問題那,如果上面的代碼我采用工廠模式的話,我每new一個對象,belle里面的屬性和方法就要重新開辟空間,這樣對大對象的操作,簡直是太過美觀不敢直視啊!

所以說,我采用下的方式就解決了這個問題。

function belle(){
    var self = this;
    self.name = "王陽";  
    self.qq = "7072547";
}
belle.prototype.myMethod = function(){
    alert("name:"+this.name+" qq:"+this.qq);
}


var be =new belle();
be.myMethod();

這樣的好處是,我把公共的方法放到原型中,給大家共享,這樣在每次new的時候都不會重新開辟空間,而是想原型鏈上進行查詢。

由於本人只是后端的C#程序員,去年剛畢業,只是在工作中邊工作邊學習,積累一些小的經驗,請各位大牛們看了,多給我點意見,而對那些小菜們,多給你們一些思路,還是那句話,要想超越別人,就在別人做其他的事情的時候,去努力,去beyond!

 PS:這里注意一下 var be = new belle();你們可以這樣理解

var be  = {}
belle.call(be);
be .__proto__ = belle.prototype;

由於老板又催活了,所以精彩繼續,過會回來。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM