我們之前已經對對象有所瞭解了,現在我們來說一下麵向對象。 我對面向對象的認識是這樣的,所謂的面向對象就是在不懂內部原理的情況下,對它的一個使用。比如在我們的生活中, 去餐廳吃飯時,我們僅只給廚師報上菜名,廚師就會把菜做出來,不需要去告訴廚師要怎樣去做,用什麼做,這就是面向對象 。萬物皆對象,對象就是 ...
我們之前已經對對象有所瞭解了,現在我們來說一下麵向對象。
我對面向對象的認識是這樣的,所謂的面向對象就是在不懂內部原理的情況下,對它的一個使用。比如在我們的生活中,
去餐廳吃飯時,我們僅只給廚師報上菜名,廚師就會把菜做出來,不需要去告訴廚師要怎樣去做,用什麼做,這就是面向對象
。萬物皆對象,對象就是由屬性和方法組成的。面向對象有三大特征,分別是封裝,繼承和多肽。
面向對象面向的是class,面向的是類,而在我們js中是沒有class沒有類的,它基於的原型。創建對象的方法有很多種
,最常用的有6種,分別是字面式、new Object()、工廠方式、構造函數式還有原型鏈創建的對象,最後一種是混合式創建,
就是構造函數和工廠方式組合在一起創建出來的對象。創建好對象之後我們就可以往裡面添加屬性了,我們可以利用this來添
加屬性,但是我們在使用原型鏈創建出來的對象就要用prototype這個屬性去添加了。每個函數都有一個屬性叫做prototype。
這個prototype的屬性值是一個對象,預設的只有一個叫做constructor的屬性,指向這個函數本身。之後我們在創建好對象之
後,我們在調用對象的時候和其他的也是一樣的new一個對象出來,這個對象的名稱一旦使用,比如說var obj=new Object()
這個obj其實指向對象的記憶體地址的一個引用,引用可以調用對象里的屬性和方法。
下麵再來說一下js中面向對象的三大特征,封裝,閉包是封裝的最好體現,說起封裝讓我們不得不回想起變數,變數分為
全局變數和局部變數,全局變數比較簡單,它可以在任何地方訪問到,麻煩就麻煩在局部變數,局部變數一般在函數外是訪問
不到的,這時候我們就可以用閉包了,我們在函數內部在來一個函數,這個函數稱為二次函數,我們一般分為父函數和子函數
,子函數可以訪問到父函數中的變數以及方法,我們稱這個子函數為特權函數,閉包在我們的使用時應該儘量的少使用它,因
為它會占用記憶體,導致記憶體的泄漏,造成系統的崩潰,如果我們使用了的話,可以用標記清除或者引用計數的方法來清除。然
後就是繼承,繼承有三種方式 一種是原型鏈繼承、另一種是構造函數式繼承,最後一種是混合繼承。我們剛纔說過,子函數
可以訪問到父函數的屬性和方法,在原型鏈繼承中,子對象有一個預設的屬性叫__proto___,他指向的是這個方法的本身,而
這個方法的本身是不具有父方法的方法以及屬性的,所以得調用它的prototype的屬性,這個prototype屬性又指向一個對象
,這個對象又是子方法的原型,那麼這個原型他又是用父方法實例化出來的,所以又是他父對象的__proto__,這個__proto__
又指向的父對象本身那個prototype,這個prototype又調用他裡面的屬性和方法,這樣的話就是他的原型鏈繼承。構造函數式
繼承最重要的一點就是冒充,父對象定義在子對象裡面,在子對象裡面可以引用父對象的屬性和方法,在構造函數中有三個參數
需要註意一下,call apply aruments call和apply兩種方法雖然都是繼承屬性,但書寫格式存在不同這裡call方法是通過this
後跟著一個字元串系列而apply方法同樣也是通過this 不過傳屬性則是由數組構成,而argument中有兩個屬性分別是返回執行
函數本身的callee 還有一個形參的個數length,最後一種混合繼承就比較簡單了,就用構造和原型混用的方式來實現繼承的。
最後一個特性是多肽就是一種食物的多種形態,允許將子類型的指針複製給父類類型的指針。
面向對象在實際中用來最多的是寫插件、組件 寫插件的一般步驟是定義一個原型,然後按照要求創建DOM元素,用原生或
js動態地去添加事件和方法,不過特殊事件要特殊處理,比如屏幕事件,屏幕的距離就要特殊處理,面向對象是一種通用思想
,並非只有編程中能用,在任何地方都可以用,面像對象提高了代碼的復用性和可擴展性但是卻降低了性能。
以上就是我對面向對象的理解,謝謝!