JS面向對象思想(OOP)


直接看js好了,模擬創建一個奧運會

function 奧運會Class(主題) {

   // 刪除主題
   // delete  this.主題;

    this.主題 = 主題;
    this.開幕時間;
    this.閉幕時間;
    this.公告簿 = "";

    //模擬開幕
    this.開幕 = function () {
        this.開幕時間 = "2012年7月28日03時12分(北京時間)";
        this.公告薄 = "奧運主題:" + this.主題 + "\n" + "開幕時間:" + this.開幕時間 + "\n" + "倫敦奧運會開幕了\n";
        this.公告發布event(this, this.公告薄);
    }

    //模擬閉幕
    this.閉幕 = function () {
        this.閉幕時間 = "2012年8月13日 04:00(北京時間)";
        this.公告薄 += this.閉幕時間 + "倫敦奧運會閉幕了\n";
        this.公告發布event(this, this.公告薄);
    }

    //模擬事件的方法
    this.公告發布event = function(sender, e) {
    }

    //構建集合對象
    this.國家集合 = new Array();
    this.運動員集合 = new Array();
    this.裁判集合 = new Array();
    this.項目集合 = new Array();




    //創建一個通用查詢
    this.通用查詢 = function (對象源, 查詢集合對象名稱, 查詢字段, value) {
        for (var aa in 對象源) {
            if (aa == 查詢集合對象名稱) {
                var source = 對象源[aa];
                if (aa == 查詢集合對象名稱) {
                    for (var i = 0; i <= source.length; i++) {
                        var s = source[i.toString()];
                        if (s[查詢字段] == value) {
                            return s;
                        }
                    }
                }
            }
        }
        return null;
    }

}




//閉包擴展,在原型上擴展方法
奧運會Class.prototype.添加國家 = function(國家名稱, 地區) {
    var 國家 = new 國家Class(國家名稱, 地區);//創建國家
    國家.所屬奧運會 = this;
    this.國家集合.push(國家);//添加國家到國家集合
    this.公告簿 += 國家名稱 + "  " + 地區 + "   " + "已經加入本屆奧運會\n";;//發布消息
    this.公告發布event(this, this.公告簿);
    //動態移除成員 或者是方法等 
    //  delete  this.公告簿; 
    //鏈式編程,進行優化
    return this;
}

奧運會Class.prototype.添加項目 = function(項目名稱) {
    var 項目 = new 項目Class(項目名稱);//創建項目
    項目.所屬奧運會 = this;
    this.項目集合.push(項目);//添加項目到國家項目

    //發布消息
    this.公告簿 += 項目名稱 + "  " + "已經加入本屆奧運會" + "  Number:" + this.項目集合.length + "\n";//發布消息
    this.公告發布event(this, this.公告簿);
    return this;
}


奧運會Class.prototype.添加裁判 = function(名稱, 所屬項目) {
    var 裁判 = new 裁判Class(名稱);//創建裁判
    裁判.所屬奧運會 = this;
    裁判.所屬的項目 = 所屬項目;
    this.裁判集合.push(裁判);//添加裁判到裁判集合

    //發布消息
    this.公告簿 += 名稱 + "  " + "裁判已經加入本屆奧運會" + "  Number:" + this.裁判集合.length + "\n";
    this.公告發布event(this, this.公告簿);
    return this;
}


奧運會Class.prototype.添加運動員 = function(名稱, 國家) {
    var 運動員 = new 運動員Class(名稱, 國家);//創建運動員
    運動員.所屬奧運會 = this;
    this.運動員集合.push(運動員);//添加運動員到運動員集合
    國家.添加運動員(運動員);

    //發布消息
    this.公告簿 += 名稱 + "  " + "加入本屆奧運會" + "  Number:" + this.運動員集合.length + "\n";
    this.公告發布event(this, this.公告簿);
    return this;
}



//國家對象
function 國家Class(國家名稱, 地區) {
    this.名稱 = 國家名稱;
    this.地區 = 地區;
    this.所屬奧運會 = null;

    this.運動員集合 = new Array();
    this.添加運動員 = function(運動員) {
        this.運動員集合.push(運動員);
    }
}


// 運動員對象
function 運動員Class(姓名, 所屬國家) {
    this.姓名 = 姓名;
    this.所屬奧運會 = null;
    this.項目集合 = new Array();
    this.所屬國家 = 所屬國家;

    this.添加項目 = function(項目) {
        this.項目集合.push(項目);
        項目.所屬運動員集合.push(this);
    }
}


//裁判對象
function 裁判Class(姓名) {
    this.姓名 = 姓名;
    this.所屬奧運會 = null;
    this.所屬的項目 = null
}

//項目對象
function 項目Class(名稱) {
    this.名稱 = 名稱;
    this.所屬奧運會 = null;
    this.成績 = "";
    this.獎牌 = "";
    this.所屬裁判 = null;

    this.所屬運動員集合 = new Array();

    this.設置比賽成績 = function() {
    }



    this.淺表克隆 = function() {
        var clone = new 項目Class();
        for (var a in this) {
            clone[a] = this[a];
        }
        return clone;
    }



    this.添加比賽成績 = function(所屬運動員, 成績單) {
        for (var i = 0; i <= this.所屬運動員集合.length; i++) {
            if (this.所屬運動員集合[i.toString()].姓名 == 所屬運動員.姓名) {
                var s = this.所屬運動員集合[i.toString()];

                for (var ii = 0; ii <= s.項目集合.length; ii++) {
                    if (s.項目集合[ii.toString()].名稱 == 成績單.名稱) {
                        var ss = s.項目集合[ii.toString()];
                        s.項目集合[ii.toString()] = 成績單;

                        this.所屬奧運會.公告簿 += 所屬運動員.姓名 + "  " + 成績單.名稱 + "  " + 成績單.成績 + "\n";
                        this.所屬奧運會.公告發布event(this, this.所屬奧運會.公告簿);
                        return;
                    }
                }

            }
        }
    }




}
   <script src="OOP奧運會.js" type="text/javascript">
    </script>

    <script type="text/javascript">
 var 奧運會 = new 奧運會Class("游倫敦,看世界!!!!!!!");

    function Button2_onclick() {
     
        //消息發布
        奧運會.公告發布event = function (sender, e) {
            document.getElementById("TextArea1").value = e;
        }
        奧運會.開幕();
}

    function Button3_onclick() {
        //消息發布
        奧運會.公告發布event = function (sender, e) {
            document.getElementById("TextArea1").value = e;
        }
        //依次添加國家地區
        /*  奧運會.添加國家("中國", "亞洲");
          奧運會.添加國家("日本", "亞洲");
          奧運會.添加國家("美國", "北美洲");
          奧運會.添加國家("德國", "歐洲");
          */

        //鏈式編程,可以這樣寫,也可以以上面的方式寫
        奧運會.添加國家("中國", "亞洲").添加國家("日本", "亞洲").添加國家("美國", "北美洲").添加國家("德國", "歐洲");

    }

function Button4_onclick() {
    //消息發布
    奧運會.公告發布event = function (sender, e) {
        document.getElementById("TextArea1").value = e;
    }
    //添加運動項目
    奧運會.添加項目("跳水").添加項目("舉重").添加項目("柔道").添加項目("籃球").添加項目("排球").添加項目("田徑");
}

function Button5_onclick() {
    //消息發布
    奧運會.公告發布event = function (sender, e) {
        document.getElementById("TextArea1").value = e;
    }
//添加裁判
 奧運會.添加裁判("張三").添加裁判("李四").添加裁判("陳三");
 

    //為裁判添加運動項目
  var 跳水 = 奧運會.通用查詢(奧運會 ,"項目集合" ,"名稱","跳水");
  var 張三 = 奧運會.通用查詢(奧運會 ,"裁判集合" ,"姓名","張三");
  跳水.所屬裁判= 張三;
  張三.所屬的項目 =跳水;
 
  var 舉重 = 奧運會.通用查詢(奧運會 ,"項目集合" ,"名稱","舉重");
  var 李四 = 奧運會.通用查詢(奧運會 ,"裁判集合" ,"姓名","李四");
  舉重.所屬裁判= 李四;
  李四.所屬的項目 =舉重;
 
  var 柔道 = 奧運會.通用查詢(奧運會 ,"項目集合" ,"名稱","柔道");
  var 陳三 = 奧運會.通用查詢(奧運會 ,"裁判集合" ,"姓名","陳三");
 柔道.所屬裁判= 陳三;
 陳三.所屬的項目 =柔道;
 
}


function Button6_onclick() {
    //消息發布
    奧運會.公告發布event = function (sender, e) {
        document.getElementById("TextArea1").value = e;
    }
    //創建運動員
    var 中國 = 奧運會.通用查詢(奧運會, "國家集合", "名稱", "中國");
    奧運會.添加運動員("郭晶晶", 中國);

    var 日本 = 奧運會.通用查詢(奧運會, "國家集合", "名稱", "日本");
    奧運會.添加運動員("小日本田", 日本);

    var 美國 = 奧運會.通用查詢(奧運會, "國家集合", "名稱", "美國");
    奧運會.添加運動員("布迪亞 ", 美國);
for (var i = 0; i < 10; i++) {

    var 中國 = 奧運會.通用查詢(奧運會, "國家集合", "名稱", "中國");
    奧運會.添加運動員("郭晶晶"+i, 中國).添加運動員("Z-" + i, 中國).添加運動員("Z-G" + i, 中國);

    var 日本 = 奧運會.通用查詢(奧運會, "國家集合", "名稱", "日本");
    奧運會.添加運動員("小日本田"+i, 日本).添加運動員("R-" + i, 日本).添加運動員("R-B" + i, 日本);

    var 美國 = 奧運會.通用查詢(奧運會, "國家集合", "名稱", "美國");
    奧運會.添加運動員("布迪亞 "+i, 美國).添加運動員("U-" + i, 美國).添加運動員("U-S" + i, 美國);

}
                

}

function Button7_onclick() {

    //消息發布
    奧運會.公告發布event = function (sender, e) {
        document.getElementById("TextArea1").value = e;
    }

    //給運動員分配運動項目
var 中國=奧運會.通用查詢(奧運會 ,"國家集合" ,"名稱","中國");
var 郭晶晶=奧運會.通用查詢(中國 ,"運動員集合" ,"姓名","郭晶晶");
var 跳水 =奧運會.通用查詢(奧運會 ,"項目集合" ,"名稱","跳水");
郭晶晶.添加項目(跳水);


var 日本=奧運會.通用查詢(奧運會 ,"國家集合" ,"名稱","日本");
var 小日本田=奧運會.通用查詢(日本 ,"運動員集合" ,"姓名","小日本田");
小日本田.添加項目(跳水);

var 美國=奧運會.通用查詢(奧運會 ,"國家集合" ,"名稱","美國");
var 布迪亞 =奧運會.通用查詢(美國 ,"運動員集合" ,"姓名","布迪亞 ");
布迪亞 .添加項目(跳水);

}

function Button8_onclick() {
    //消息發布
    奧運會.公告發布event = function (sender, e) {
        document.getElementById("TextArea1").value = e;
    }
    //為運動設置成績
var 中國=奧運會.通用查詢(奧運會 ,"國家集合" ,"名稱","中國");
var 郭晶晶=奧運會.通用查詢(中國 ,"運動員集合" ,"姓名","郭晶晶");
var 跳水1 =奧運會.通用查詢(奧運會 ,"項目集合" ,"名稱","跳水").淺表克隆();

//先得到要修改數據對象的引用
var 跳水1set =奧運會.通用查詢(郭晶晶 ,"項目集合" ,"名稱","跳水");
跳水1.成績="99分";
跳水1set.添加比賽成績(郭晶晶,跳水1);


var 日本=奧運會.通用查詢(奧運會 ,"國家集合" ,"名稱","日本");
var 小日本田=奧運會.通用查詢(日本 ,"運動員集合" ,"姓名","小日本田");
var 跳水2 =奧運會.通用查詢(奧運會 ,"項目集合" ,"名稱","跳水").淺表克隆();

var 跳水2set =奧運會.通用查詢(小日本田 ,"項目集合" ,"名稱","跳水");
跳水2.成績="25分";
跳水2set.添加比賽成績(小日本田,跳水2);
}


function Button9_onclick() {

    //消息發布
    奧運會.公告發布event = function (sender, e) {
        document.getElementById("TextArea1").value = e;
    }
    奧運會.閉幕();
}

    </script>

具體效果

喜歡的人可以下載看看,體會OOP思想http://files.cnblogs.com/BABLOVE/JSOOP%E5%A5%A5%E8%BF%90%E4%BC%9A.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM