我是一名.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;
由於老板又催活了,所以精彩繼續,過會回來。。。