js中的面向?qū)ο?/h2>

舉兩個例子:
1,把大象裝進冰箱:
面向過程:1,打開冰箱門,2,把大象放進去;3,關(guān)上冰箱門
面向?qū)ο螅?,先創(chuàng)建一個冰箱的對象,還有大象的對象;
2,給冰箱對象一個開開冰箱門,關(guān)上冰箱門的功能;給大象一個走進冰箱的功能
3,調(diào)用大象的走進冰箱的方法,調(diào)用冰箱的關(guān)上冰箱門的方法
2,五子棋游戲
面向過程:1,黑子先走,判斷黑子有沒有連城一條線
2,白字再走,判斷白字有沒有連城一條線
面向?qū)ο螅合葎?chuàng)建出來黑子,白字的對象,都有落旗子的功能,再創(chuàng)建出來游戲規(guī)則對象,判斷哪一方贏
調(diào)用黑子的落旗子方法,調(diào)用游戲規(guī)則對象判斷黑子是否贏
調(diào)用白字的羅旗子方法,調(diào)用游戲規(guī)則對象判斷白字是否贏

對象里的幾個重要的概念:

對象(實例):屬性(對象的特征),方法(對象的行為)
封裝
繼承
多態(tài)
js是基于對象的語言,而不是面向?qū)ο蟮恼Z言,當需要使用js代碼實現(xiàn)面向?qū)ο缶幊趟枷霑r,就使用js代碼來模擬面向?qū)ο笳Z言的各種概念,特征
類(class)是一堆具有相同屬性、方法的數(shù)據(jù)類型的集合,對象是把類(class)的屬性和方法具體化后的一種數(shù)據(jù)類型。
在面向?qū)ο笳Z言中,必須通過類來創(chuàng)建對象,而js中沒有類的概念,所以就是用“構(gòu)造函數(shù)”來模擬(充當、代替)面相對象語言中的"類",通過構(gòu)造函數(shù)來創(chuàng)建對象。
// 屬性和方法
// 屬性就是屬于某個對象的變量,該變量只能通過他所歸屬的對象調(diào)用、訪問,其他對象無法獲取到;
// 方法就是屬于某個對象的函數(shù),該函數(shù)只能通過他所歸屬的對象調(diào)用、訪問,其他對象無法獲取到。

在js中,因為直接通過"var”定義的變量、函數(shù)都默認屬于window對象,所以js就有了"基于對象"這個語言名稱。
繼承:類與類之間一旦聲明了繼承關(guān)系,如:A繼承自B(A是通過B創(chuàng)建出來的子類,B是父類,A是子類),B類中擁有的屬性、方法,在A類中不用再次創(chuàng)建,因為子類可以獲取到父類的屬性和方法,這種關(guān)系就是繼承。
多態(tài):各個對象在獲取到創(chuàng)建這個對象的類中所有的方法時,方法是同一個方法,但是因為是由不同對象調(diào)用的,所以這些方法執(zhí)行結(jié)果可能不同(同一個類創(chuàng)建的不同對象,具備同樣的方法,但是因為對象不同,所以方法執(zhí)行的結(jié)果也可能不同),這種行為就是多態(tài)。

js創(chuàng)建對象的方法
1,直接創(chuàng)建:
var person = {
name:'張三',
age:34,
sayHi:function(){
alert('hello')
}
}
2,使用工廠方法創(chuàng)建對象
function createPerson(name,age){
//創(chuàng)建一個空對象
var per = new Object();
// var per = {};
per.name = name;
per.age = age;
per.sayHi = function(){
alert('hello')
}
return per;
}
//調(diào)用工廠函數(shù),獲取新創(chuàng)建的對象
var person1 = createPerson('zhang',34)
3,構(gòu)造函數(shù)創(chuàng)建對象(都要用this)
function CreatePerson(name, age) {
//此this是指的window
this.name = name;
this.age = age;
this.sayHi = function () {
alert('hello');
}

        }
     var per1 = new CreatePerson('張三', 18);
        console.log(per1);
        console.log(per1 instanceof CreatePerson);
        var per2 = new CreatePerson('李四', '22');
        console.log(per2);

4,通過原型創(chuàng)建對象
// 通過原型創(chuàng)建對象
// 優(yōu)勢:可以把對象公有的數(shù)據(jù)統(tǒng)一托管在原型中,以達到節(jié)約內(nèi)存的目的
function CreateAnimal(name, age) {
// 把所有對象公有的相同屬性和所有方法全部存在原型中,以達到節(jié)約內(nèi)存的目的
// 把各自對象值不同的屬性,放在實例中,有對象自己開辟內(nèi)存空間,維護自己獨有的值
this.name = name;
this.age = age;
CreateAnimal.prototype.sayHi = function () {
alert('汪汪');
}
}

        var dog1 = new CreateAnimal('阿黃', 4);
        console.log(dog1.name);
        console.log(dog1.age);

        var dog2 = new CreateAnimal('旺財', 8);
        console.log(dog2.name);
        console.log(dog2.age);

        console.log(dog1.name);
        console.log(dog1.age); 

5,// 動態(tài)原型創(chuàng)建對象
// 如果原型中已經(jīng)存在相關(guān)的屬性和方法,則構(gòu)造函數(shù)中,添加原型屬性、方法的代碼不再執(zhí)行。
function CreateCat(name, age) {
this.name = name;
this.age = age;
// CreateCat.prototype.sayHi
//
if (typeof(CreateCat.prototype.sayHi) != 'function') {
CreateCat.prototype.sayHi = function () {
alert('喵喵,我的名字是:' + this.name);
}
}
}

        var cat1 = new CreateCat('咪咪', 18);
        var cat2 = new CreateCat('哈哈哈哈', 2);

        cat1.sayHi();
        cat2.sayHi();

  訪問對象的屬性
    function CreatePerson(name,age) {
            this.name = name;
            this.age = age;
            this.sayHi = function () {
                alert('hello');
            }
        }

        var person1 = new CreatePerson('張三', 18);

        // 通過點語法的方式訪問:對象名.屬性名
        console.log(person1.name);
        // 通過下標的方式訪問屬性:對象名['字符串類型的屬性名']
        var name = 'name';
        console.log(person1[name]);

        // 修改屬性的值:對象名.屬性名=賦新值
        person1.name = '李四';

        person1.gender = '男';
        console.log(person1);

        // 刪除對象下的屬性:delete
        delete person1.gender;
        console.log(person1);


        var arr = [12, 23, 34, 45, 56, 67, 78, 89, 90];

        // 使用快速遍歷,來遍歷對象屬性
        for (var item in person1) {
            // 通過條件,過濾對象中的方法,只遍歷出屬性
            if (typeof(person1[item]) != 'function') {
                console.log(person1[item]);
            }
        }
// 定義一個構(gòu)造函數(shù),通過該函數(shù)可以創(chuàng)建一個能計算平方的對象
        function PingFang(num) {
            this.num = num;
            this.pingFang = function () {
                return this.num*this.num;
            }
        }

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容