js的this和物件導向程式設計

2021-09-06 15:45:09 字數 1318 閱讀 4539

很奇怪的是很多書或資料沒有把這個事情講清楚。

關鍵就是在於沒有乙個整體的思維技術模式,問題被隔離了所以反而不容易理解。

我們先看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 資料和處理函式沒有直接的...