js面向對象(第五周)
什么是面向對象
面向對象是一種編程思想,是在面向過程編程(結構化編程)之后出現的,面向對象的思想基于抽象數據類型,在面向過程編程中,如果把某種數據結構和用于操作他的各種方法模塊化一起,會很方便,如果抽象數據進一步抽象成模塊,就會發現這些模塊就是具體的東西(對象),
面向對象中,對象可以接收其他對象傳過來的消息,對象中可以包含其他對象對象可以被當作其他類型的對象,這要求對象的類型“繼承”另外的類型。對象只能通過其所提供的接口來進行訪問,其內部具體實現是不可訪問的,這成為“封裝”。面向對象方法的三個核心要素是:封裝、繼承、多態。
js面向對象的方式
- 對象字面量創建對象:
var fahui = {
name:"發揮不廣泛",
showName:function(){
console.log(this.name);
}
}
console.log(fahui);
fahui.showName();
對象字面量創建對象
- 工廠方式創建對象
function createUser(name){//name 視為原料
var obj = new Object(); //加工過程
obj.name = name; //加工過程
obj.showName = function(){ //加工過程
console.log(this.name); //加工過程
} //加工過程
return obj; //成品出廠
}
var fahui = createUser("發揮不廣泛"); //創建對象
var zhangsan = createUser("張三");
console.log(fahui); //打印對象
console.log(zhangsan);
fahui.showName(); //調用對象方法
zhangsan.showName();
工廠方式創建對象
批量創建對象會比對象字面量創建方便很多;
- 構造函數創建對象
function User(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
}
var fahui = createUser("發揮不廣泛"); //創建對象
var zhangsan = createUser("張三");
console.log(fahui); //打印對象
console.log(zhangsan);
fahui.showName(); //調用對象方法
zhangsan.showName();
構造函數方式創建對象
工廠方式和構造函數方式在創建多個對象時,每個對象中都會出現相同的方法,或者相同的屬性,這樣就會造成數據的大量冗余。
解決方式:參考JavaScript原生對象,如Array對象,在控制臺打印一個數組對象:
javascript數組對象查看.gif
有很多的原型屬性,使用原型就可以解決上面的大量的數據冗余問題,所以js面向對象是這樣的:
/**
定義類,或者叫構造函數
普通用戶類
**/
function User(name,age,sex){ //類,或者叫構造函數
this.name = name;
this.age = age;
this.sex = sex;
}
User.prototype.showName = function(){ //類方法
console.log(this.name);
}
User.prototype.showAge = function(){
console.log(this.age);
}
User.prototype.showSex = function(){
console.log(this.sex);
}
/**
繼承 VIP用戶類(繼承自普通用戶類)
**/
function VipUser(name,age,sex,level){
User.call(this,name,age,sex);
this.level = level;
}
VipUser.prototype = new User();
VipUser.prototype.constructor = VipUser;
VipUser.prototype.showLevel = function(){
console.log(this.level);
}
/**
普通用戶類對象 張三
**/
var zhangsan = new User("張三",25,"男");
zhangsan.showName();
zhangsan.showAge();
zhangsan.showSex();
/**
Vip用戶對象 發揮不廣泛
**/
var fahui = new VipUser("發揮不廣泛",18,"男","Vip頂級");
fahui.showName();
fahui.showAge();
fahui.showSex();
fahui.showLevel();
結果:
JavaScript面向對象
上面的這樣寫法和Java面向對象相比,不是很像,實現起來,理解起來都和Java面向對象有點不同,比如,構造函數就是類,在Java中構造函數就是構造函數,類就是類,為了解決這個問題es6推出了新的寫法,新寫法和Java就很像了,下面是好將上面實現過程用es6寫出的:
/**
定義類,或者叫構造函數
普通用戶類
**/
class User{
constructor(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
showName(){
console.log(this.name);
}
showAge(){
console.log(this.age);
}
showSex(){
console.log(this.sex);
}
}
/**
繼承 VIP用戶類(繼承自普通用戶類)
**/
class VipUser extends User{
constructor(name,age,sex,level){
super(name,age,sex);
this.level = level;
}
showLevel(){
console.log(this.level);
}
}
/**
普通用戶類對象 張三
**/
var zhangsan = new User("張三",25,"男");
zhangsan.showName();
zhangsan.showAge();
zhangsan.showSex();
/**
Vip用戶對象 發揮不廣泛
**/
var fahui = new VipUser("發揮不廣泛",18,"男","Vip頂級");
fahui.showName();
fahui.showAge();
fahui.showSex();
fahui.showLevel();
<完>
20180823
發揮不廣泛微信公眾號
發揮不廣泛