阿里面試題及答案詳解(一)(逐行代碼註釋並附解題思路)

題目:阿里雲產品線十分豐富,擁有ECSRDS等數百款產品,每個產品都具有一些通用屬性,例如:ID(id)地域(region)名稱(name),同時每個產品又包含自己特有的屬性。 ECS擁有實例(instance)屬性,可選值有ecs.t1.smallecs.t3.smallecs.t1.largeRDS擁有數據庫類型(dbType)屬性,可選值有mysqlmssqlPPAS。請使用你的面向對象知識,基於ES6語法編寫ECSRDS兩個類,並實現如下方法:
1、config()返回一個字面量對象,可以拿到所有的成員變量。
2、buy()返回一個URL,格式爲 https://www.aliyun.com/buy?id=xxx&region=xxx&name=xxx&每個產品自己特有的成員變量

思路:

1、人家告訴你ECSRDS即有通用屬性,又包含自己的特有屬性,很明顯考的是面向對象中的繼承。
2、最後還讓你基於ES6語法編寫ECSRDS這兩個類,說明要用到的是ES6當中的類。
3、通用屬性爲父類(Product),特有屬性爲子類(ECSRDS)。
根據以上三點,以下代碼就出爐了:

// 定義父類,名字是自己取的
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.smallecs.t3.smallecs.t1.largeRDS擁有數據庫類型(dbType)屬性,可選值有mysqlmssqlPPAS。我們發現這些可選值比較長,爲了預防手拼出現錯誤,咱們可以將這些可選值放到一個字面量對象當中:

// 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&region=bj&name=ecs&instance=ecs.t1.large
console.log(_ecs.buy());
// 輸出:https://www.aliyun.com/buy?id=2&region=tj&name=rds&instance=mssql
console.log(_rds.buy());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章