阿里面試題及答案詳解(一)(逐行程式碼註釋並附解題思路)
題目:阿里雲產品線十分豐富,擁有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());
—————END—————
[公眾號回覆“電子書”,送你經典前端電子書籍]
喜歡本文的朋友們,歡迎關注微信公眾號 張培躍,收看更多精彩內容