舉兩個(gè)例子:
1跪楞,把大象裝進(jìn)冰箱:
面向過程:1,打開冰箱門,2侣灶,把大象放進(jìn)去甸祭;3,關(guān)上冰箱門
面向?qū)ο螅?褥影,先創(chuàng)建一個(gè)冰箱的對象池户,還有大象的對象;
2凡怎,給冰箱對象一個(gè)開開冰箱門校焦,關(guān)上冰箱門的功能;給大象一個(gè)走進(jìn)冰箱的功能
3栅贴,調(diào)用大象的走進(jìn)冰箱的方法斟湃,調(diào)用冰箱的關(guān)上冰箱門的方法
2,五子棋游戲
面向過程:1檐薯,黑子先走凝赛,判斷黑子有沒有連城一條線
2,白字再走坛缕,判斷白字有沒有連城一條線
面向?qū)ο螅合葎?chuàng)建出來黑子墓猎,白字的對象,都有落旗子的功能赚楚,再創(chuàng)建出來游戲規(guī)則對象毙沾,判斷哪一方贏
調(diào)用黑子的落旗子方法,調(diào)用游戲規(guī)則對象判斷黑子是否贏
調(diào)用白字的羅旗子方法宠页,調(diào)用游戲規(guī)則對象判斷白字是否贏
對象里的幾個(gè)重要的概念:
類
對象(實(shí)例):屬性(對象的特征)左胞,方法(對象的行為)
封裝
繼承
多態(tài)
js是基于對象的語言寇仓,而不是面向?qū)ο蟮恼Z言,當(dāng)需要使用js代碼實(shí)現(xiàn)面向?qū)ο缶幊趟枷霑r(shí)烤宙,就使用js代碼來模擬面向?qū)ο笳Z言的各種概念遍烦,特征
類(class)是一堆具有相同屬性、方法的數(shù)據(jù)類型的集合躺枕,對象是把類(class)的屬性和方法具體化后的一種數(shù)據(jù)類型服猪。
在面向?qū)ο笳Z言中,必須通過類來創(chuàng)建對象拐云,而js中沒有類的概念罢猪,所以就是用“構(gòu)造函數(shù)”來模擬(充當(dāng)、代替)面相對象語言中的"類"叉瘩,通過構(gòu)造函數(shù)來創(chuàng)建對象膳帕。
// 屬性和方法
// 屬性就是屬于某個(gè)對象的變量,該變量只能通過他所歸屬的對象調(diào)用房揭、訪問备闲,其他對象無法獲取到;
// 方法就是屬于某個(gè)對象的函數(shù)捅暴,該函數(shù)只能通過他所歸屬的對象調(diào)用恬砂、訪問,其他對象無法獲取到蓬痒。
在js中泻骤,因?yàn)橹苯油ㄟ^"var”定義的變量、函數(shù)都默認(rèn)屬于window對象梧奢,所以js就有了"基于對象"這個(gè)語言名稱狱掂。
繼承:類與類之間一旦聲明了繼承關(guān)系,如:A繼承自B(A是通過B創(chuàng)建出來的子類亲轨,B是父類趋惨,A是子類),B類中擁有的屬性惦蚊、方法器虾,在A類中不用再次創(chuàng)建,因?yàn)樽宇惪梢垣@取到父類的屬性和方法蹦锋,這種關(guān)系就是繼承兆沙。
多態(tài):各個(gè)對象在獲取到創(chuàng)建這個(gè)對象的類中所有的方法時(shí),方法是同一個(gè)方法莉掂,但是因?yàn)槭怯刹煌瑢ο笳{(diào)用的葛圃,所以這些方法執(zhí)行結(jié)果可能不同(同一個(gè)類創(chuàng)建的不同對象,具備同樣的方法,但是因?yàn)閷ο蟛煌庹苑椒▓?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)建一個(gè)空對象
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)一托管在原型中讯柔,以達(dá)到節(jié)約內(nèi)存的目的
function CreateAnimal(name, age) {
// 把所有對象公有的相同屬性和所有方法全部存在原型中抡蛙,以達(dá)到節(jié)約內(nèi)存的目的
// 把各自對象值不同的屬性,放在實(shí)例中魂迄,有對象自己開辟內(nèi)存空間粗截,維護(hù)自己獨(dú)有的值
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('旺財(cái)', 8);
console.log(dog2.name);
console.log(dog2.age);
console.log(dog1.name);
console.log(dog1.age);
5,// 動(dòng)態(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);
// 通過點(diǎn)語法的方式訪問:對象名.屬性名
console.log(person1.name);
// 通過下標(biāo)的方式訪問屬性:對象名['字符串類型的屬性名']
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è)構(gòu)造函數(shù)昂利,通過該函數(shù)可以創(chuàng)建一個(gè)能計(jì)算平方的對象
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);