很奇怪的是很多書或資料沒有把這個事情講清楚。
關鍵就是在於沒有乙個整體的思維技術模式,問題被隔離了所以反而不容易理解。
我們先看this,這是js的關鍵字,指示函式的上下文物件。
這裡問題就來了,比如:
var obj = {};
obj.name = 'test';
obj.output = function () ;
obj.output();
this指定了上下文物件,當然如果沒有指定就會指定到全域性變數,window,這就是問題的根源所在。所以最好的解決方案,就是使用'use strict'嚴格模式,一但出錯,比較容易定位問題。
在不用嚴格模式下,我們看看問題出現在**?
重新命名變數時:
比如上面,console.log(obj.name),不用this的話,那麼在其它**裡obj被另外變數定義,明顯要出錯。但用了this,**環境一變就出問題。
比如我們把這個物件重構成建構函式:
function obj(name)
return new pclass();
}var p1 = pclass();
var p2 = new pclass();
p1.output();
p2.output();
不用new,倒是對了,第乙個問題得到解決,但如果再new就會變成巢狀呼叫。出錯。很明顯,出錯是因為this,所以我們在內部,直接定義物件返回,做成真正的「建構函式」
function pclass() }}
var p1 = pclass();
var p2 = new pclass();
p1.output();
p2.output();
這問題又來了,直接返回物件避免了this的問題,但明顯重複,比如p1,p2使用了兩個例項的output方法,這是不可以容忍的。
所以這就導致了js在處理物件的建立方面無法提供有效的機制,this和new不匹配,徹底的解決方案就是es6,引入class關鍵字,否則的話,不管怎麼建立都沒有完美的解決方案,而且**囉嗦。
在es5上,次好的解決方案是:
1.引入'use strict',防止錯誤的建構函式及this
2.建構函式首字母大寫,其它的一律駝峰,通過命名來區分
3.建立物件一律使用new,並使用簡單的prototype模式
4.非new形式盡量使用module模式
5.最關鍵的地方,js物件就不是長項,物件導向程式設計也並非最佳方式,應該優先考慮組合模式,把物件和方法體分開,這從根源上解決js的物件弱點。
js的this和物件導向程式設計
很奇怪的是很多書或資料沒有把這個事情講清楚。關鍵就是在於沒有乙個整體的思維技術模式,問題被隔離了所以反而不容易理解。我們先看this,這是js的關鍵字,指示函式的上下文物件。這裡問題就來了,比如 var obj obj.name test obj.output function obj.output...
面向過程程式設計和物件導向程式設計
面向過程程式設計和物件導向程式設計 面向過程程式設計是一種以 過程為中心 的程式設計思想 分析出解決問題的步驟,然後用函式把這些步驟一步一步實現 面向過程程式設計,資料和對資料的操作是分離的。物件導向程式設計 物件導向程式設計是 將事物物件化,通過物件通訊來解決問題 物件導向程式設計,資料和對資料的...
面向過程程式設計和物件導向程式設計
面向過程程式設計和物件導向程式設計 一 面向過程程式設計 面向過程程式設計將程式分成了 資料 和 處理函式 兩部分,程式以 處理函式 為核心,如果要執行什麼操作,就將 資料 傳給相應的 處理函式 返回我們需要的結果 面向過程的思路很好掌握,上手容易,但它存在三方面的問題 1 資料和處理函式沒有直接的...