題目:阿里雲產品線十分豐富,擁有
ECS
、RDS
等數百款產品,每個產品都具有一些通用屬性,例如:ID(id)
,地域(region)
,名稱(name)
,同時每個產品又包含自己特有的屬性。 ECS擁有實例(instance
)屬性,可選值有ecs.t1.small
、ecs.t3.small
、ecs.t1.large
,RDS
擁有數據庫類型(dbType
)屬性,可選值有mysql
、mssql
、PPAS
。請使用你的面向對象知識,基於ES6
語法編寫ECS
、RDS
兩個類,並實現如下方法:
1、config()
返回一個字面量對象,可以拿到所有的成員變量。
2、buy()
返回一個URL,格式爲https://www.aliyun.com/buy?id=xxx®ion=xxx&name=xxx&
每個產品自己特有的成員變量
思路:
1、人家告訴你ECS
、RDS
即有通用屬性,又包含自己的特有屬性,很明顯考的是面向對象中的繼承。
2、最後還讓你基於ES6
語法編寫ECS
、RDS
這兩個類,說明要用到的是ES6當中的類。
3、通用屬性爲父類(Product
),特有屬性爲子類(ECS
、RDS
)。
根據以上三點,以下代碼就出爐了:
// 定義父類,名字是自己取的
class Product {
}
// 定義子類ECS繼承了父類Product
class ECS extends Product {
}
// 定義子類RDS繼承了父類Product
class RDS extends Product {
}
4、現在父類還沒屬性,將商品共有的已知屬性ID(id)
,地域(region)
,名稱(name)
放到父類Product
中,記得這裏屬性是需要通過接收參數賦值的,否則後面就沒法玩了。
// 定義父類,名字是自己取的
class Product {
// 通過構造器接收屬性值_id、_region、_name
constructor(_id, _region, _name) {
// 增加ID屬性
this.id = _id;
// 增加地域(region)屬性
this.region = _region;
// 增加名稱(name)屬性
this.name = _name;
}
}
5、爲子類ECS
添加實例(instance
)屬性
// 定義子類ECS繼承了父類Product
class ECS extends Product {
// 接收通用屬性_id,_region,_name與獨有的實例(instance)屬性
constructor(_id, _region, _name, _instance) {
// 將通用屬性傳遞給父類
super(_id, _region, _name);
// 增加實例(instance)屬性
this.instance = _instance;
}
}
6、爲子類RDS
添加數據庫類型(dbType
)屬性
// 定義子類RDS繼承了父類Product
class RDS extends Product {
// 接收通用屬性_id,_region,_name與獨有的數據庫類型(dbType)屬性
constructor(_id, _region, _name, _dbType) {
// 將通用屬性傳遞給父類
super(_id, _region, _name);
// 增加數據庫類型(dbType)屬性
this.instance = _dbType;
}
}
7、ECS
擁有實例(instance
)屬性,可選值有ecs.t1.small
、ecs.t3.small
、ecs.t1.large
。RDS
擁有數據庫類型(dbType
)屬性,可選值有mysql
、mssql
、PPAS
。我們發現這些可選值比較長,爲了預防手拼出現錯誤,咱們可以將這些可選值放到一個字面量對象當中:
// instance 屬性值
let instaceEnum = {
t1s:"ecs.t1.small",
t3s:"ecs.t3.small",
t1l:"ecs.t1.large"
}
// dbType 屬性值
let dbTypeEnum = {
mysql:"mysql",
mssql:"mssql",
PPAS:"PPAS"
}
8、config()
返回一個字面量對象,可以拿到所有的成員變量。我們可以在父類Product
中添加config
方法,返回this即可:
// 返回所有成員變量
config(){
return this;
}
9、buy()
返回一個URL
,格式爲每個產品的所有成員變量。我們可以將產品所有的成員變量進行拼接即可,父類添加方法buy
:
buy(){
// 設置返回URL的默認值
var url="https://www.aliyun.com/buy?";
// 設置一個空數組,用於存放參數
var urlArr = [];
for(let key in this){
// 判斷是否存在某屬性,這裏也可以用this.hasOwnProperty(key)
if(this[key])
urlArr.push(key + "=" + this[key]);// 拼接後放到數組中
}
// 將urlArr以"&"分割轉爲字符串
url += urlArr.join("&");
return url;
}
10、完整代碼:
// instance 屬性值
let instaceEnum = {
t1s: "ecs.t1.small",
t3s: "ecs.t3.small",
t1l: "ecs.t1.large"
}
// dbType 屬性值
let dbTypeEnum = {
mysql: "mysql",
mssql: "mssql",
PPAS: "PPAS"
}
// 定義父類,名字是自己取的
class Product {
// 通過構造器接收屬性值_id、_region、_name
constructor(_id, _region, _name) {
// 增加ID屬性
this.id = _id;
// 增加地域(region)屬性
this.region = _region;
// 增加名稱(name)屬性
this.name = _name;
}
// 返回所有成員變量
config() {
return this;
}
// 獲得URL
buy() {
// 設置返回URL的默認值
var url = "https://www.aliyun.com/buy?";
// 設置一個空數組,用於存放參數
var urlArr = [];
for (let key in this) {
// 判斷是否存在某屬性,這裏也可以用this.hasOwnProperty(key)
if (this[key])
urlArr.push(key + "=" + this[key]);// 拼接後放到數組中
}
// 將urlArr以"&"分割轉爲字符串
url += urlArr.join("&");
return url;
}
}
// 定義子類ECS繼承了父類Product
class ECS extends Product {
// 接收通用屬性_id,_region,_name與獨有的實例(instance)屬性
constructor(_id, _region, _name, _instance) {
// 將通用屬性傳遞給父類
super(_id, _region, _name);
// 增加實例(instance)屬性
this.instance = _instance;
}
}
// 定義子類RDS繼承了父類Product
class RDS extends Product {
// 接收通用屬性_id,_region,_name與獨有的數據庫類型(dbType)屬性
constructor(_id, _region, _name, _dbType) {
// 將通用屬性傳遞給父類
super(_id, _region, _name);
// 增加數據庫類型(dbType)屬性
this.instance = _dbType;
}
}
11、測試下是否OK:
var _ecs = new ECS(1, "bj", "ecs", instaceEnum.t1l);
var _rds = new RDS(2, "tj", "rds", dbTypeEnum.mssql);
// 輸出:ECS { id: 1, region: 'bj', name: 'ecs', instance: 'ecs.t1.large' }
console.log(_ecs.config());
// 輸出:RDS { id: 2, region: 'tj', name: 'rds', instance: 'mssql' }
console.log(_rds.config());
// 輸出:https://www.aliyun.com/buy?id=1®ion=bj&name=ecs&instance=ecs.t1.large
console.log(_ecs.buy());
// 輸出:https://www.aliyun.com/buy?id=2®ion=tj&name=rds&instance=mssql
console.log(_rds.buy());