面向對象

為什么要學習面向對象(面向對象思想)

面向對象奇數(shù)是目前流行的系統(tǒng)設計開發(fā)技術,它包括面向對象分析和面向對象程序設計。面向對象程序設計技術的提出,主要是為了解決傳統(tǒng)程序設計方法——結構化程序設計所不能解決的代碼重用問題。


面向對象三個基本特征

1、封裝

封裝是面向對象的特征之一,是對象和概念的主要特性。封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。面向對象計算始于這個基本概念,即現(xiàn)實世界可以被描繪成一系列完全自治。封裝的對象,這些對象通過一個受保護的接口訪問其他對象。一旦定義了一個對象的特性,則有必要決定這些特性的可見性,即哪些特性對外部世界是可見的,哪些特性用于表示內部狀態(tài)。在這個階段定義對象的接口。通常,應禁止直接訪問一個對象的實際表示,而應通過操作接口訪問對象,這成為信息隱藏。事實上,信息隱藏是用戶對封裝性的認識,封裝則為信息隱藏提供支持。封裝保證了模塊具有較好的獨立性,使得程序維護修改較為容易。對應用程序的修改僅限于類的內部,因而可以將應用程序修改帶來的影響減少到最低限度。

animate函數(shù)是動畫封裝函數(shù) 
  @para0  elem參數(shù)就是運動的對象 
  @para1  targetJSON參數(shù)就是運動的終點狀態(tài),可以寫px,也可以不寫px 
            { 
                "left": 500, 
                "top": 600 
            } 
  @para2  time是運動總時間,毫秒為單位 
  @para3  tweenString緩沖描述詞,比如"Linear",可選 
  @para4  callback是回調函數(shù),可選 
  return    本函數(shù)沒有返回值 
function animate(elem , targetJSON , time , tweenString , callback){ 
    //函數(shù)重載,用戶傳進來的參數(shù)數(shù)量、類型可能不一樣 
    //檢查數(shù)量和類型 
    if(arguments.length < 3 || typeof arguments[0] != "object" || typeof arguments[1] != "object" || typeof arguments[2] != "number"){ 
        throw new Error("對不起,你傳進來的參數(shù)數(shù)量不對或者參數(shù)類型不對,請仔細檢查哦!"); 
        return; 
    }else if(arguments.length == 3){ 
        //用戶只傳進來3個參數(shù),表示tweenString、callback被省略了,那么我們默認使用Linear當做緩沖詞 
        tweenString = "Linear"; 
        //默認回調函數(shù)是null 
        callback = null; 
    }else if(arguments.length == 4){ 
        //用戶只傳進來4個參數(shù),第4個參數(shù)可能傳進來的是tweenString,也可能是callback 
        switch(typeof arguments[3]){ 
            case "string" :  
                //用戶傳進來的是緩沖描述詞兒,所以就把callback補為null 
                callback = null; 
                break; 
            case "function" :  
                callback = arguments[3]; 
                tweenString = "Linear"; 
                break; 
            default :  
                throw new Error("抱歉,第4個參數(shù)要么是緩沖描述詞,要么是回調函數(shù),請檢查!"); 
        } 
    } 

2、繼承

由于js不像java那樣是真正面向對象的語言,js是基于對象的,它沒有類的概念。所以,要想實現(xiàn)繼承,可以用js的原型prototype機制或者用apply和call方法去實現(xiàn)。
在面向對象的語言中,我們使用類來創(chuàng)建一個自定義對象。然而js中所有事物都是對象,那么用什么辦法來創(chuàng)建自定義對象呢?這就需要用到js的原型:我們可以簡單的把prototype看做是一個模版,新創(chuàng)建的自定義對象都是這個模版(prototype)的一個拷貝 (實際上不是拷貝而是鏈接,只不過這種鏈接是不可見,新實例化的對象內部有一個看不見的Proto指針,指向原型對象)。
js可以通過構造函數(shù)和原型的方式模擬實現(xiàn)類的功能。 另外,js類式繼承的實現(xiàn)也是依靠原型鏈來實現(xiàn)的。

function People(name,age,sex){
                this.name = name;
                this.age = age;
                this.sex = sex;
            }
            People.prototype.sayHello = function(){
                alert("你好我是人" + this.name);
            }
            People.prototype.chifan = function(){
                alert("我吃飯了!mia mia");
            }
            function Student(name,age,sex,xuehao,xiaohonghuageshu){
                this.name = name;
                this.age = age;
                this.sex = sex;
                this.xuehao = xuehao;
                this.xiaohonghuageshu = xiaohonghuageshu;
            }
            //核心語句,繼承的實現(xiàn)全靠這條語句了:
            Student.prototype = new People();
            Student.prototype.sayHello = function(){
                alert("你好我是小學生,我的學號是" + this.xuehao);
            }
            Student.prototype.study = function(){
                alert("好好學習,天天向上");
            }
            Student.prototype.lol = function(){
                alert("玩兒英雄聯(lián)盟啊!");
            }
            var xiaohong = new Student("小紅",11,"女",20160001,4);
            //xiaohong.lol();
            //xiaohong.chifan();
            xiaohong.sayHello();

3、多態(tài)

多態(tài)性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
實現(xiàn)多態(tài),有二種方式,覆蓋,重載。
覆蓋,是指子類重新定義父類的虛函數(shù)的做法。
重載,是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個數(shù)不同,或許參數(shù)類型不同,或許兩者都不同)。
其實,重載的概念并不屬于“面向對象編程”,重載的實現(xiàn)是:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對于編譯器來說是這樣的)。如,有兩個同名函數(shù):function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過修飾后的函數(shù)名稱可能是這樣的:int_func、str_func。對于這兩個函數(shù)的調用,在編譯器間就已經(jīng)確定了,是靜態(tài)的(記住:是靜態(tài))。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無關!真正和多態(tài)相關的是“覆蓋”。當子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)(記?。菏莿討B(tài)?。┑恼{用屬于子類的該函數(shù),這樣的函數(shù)調用在編譯期間是無法確定的(調用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運行期綁定的(晚邦定)。結論就是:重載只是一種語言特性,與多態(tài)無關,與面向對象也無關!引用一句Bruce Eckel的話:“不要犯傻,如果它不是晚邦定,它就不是多態(tài)。”
那么,多態(tài)的作用是什么呢?我們知道,封裝可以隱藏實現(xiàn)細節(jié),使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態(tài)則是為了實現(xiàn)另一個目的——接口重用!多態(tài)的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。

var makeSound=function (animal) {
        animal.sound();
    }
    var Duck=function () {
    }
    var Dog=function () {
    }
    Duck.prototype.sound=function () {
        console.log("嘎嘎嘎")
    }
    Dog.prototype.sound=function () {
        console.log("旺旺旺")
    }
    makeSound(new Duck());
    makeSound(new Dog());

面向對象程序設計的優(yōu)點

1、開發(fā)時間短,效率高,可靠性高,所開發(fā)的程序更強壯。由于面向對象編程的可重用性,可以在應用程序中大量采用成熟的類庫,從而縮短了開發(fā)時間。
2、應用程序更易于維護、更新和升級。繼承和封裝使得應用程序的修改帶來的影響更加局部化。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容