前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阿里面试题及答案详解(一)(逐行代码注释并附解题思路)

阿里面试题及答案详解(一)(逐行代码注释并附解题思路)

作者头像
用户1272076
发布2019-03-26 17:36:11
1.4K0
发布2019-03-26 17:36:11
举报
文章被收录于专栏:张培跃

题目:阿里云产品线十分丰富,拥有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&region=xxx&name=xxx&每个产品自己特有的成员变量

思路:

1、人家告诉你ECS、RDS即有通用属性,又包含自己的特有属性,很明显考的是面向对象中的继承。

2、最后还让你基于ES6语法编写ECS、RDS这两个类,说明要用到的是ES6当中的类。

3、通用属性为父类(Product),特有属性为子类(ECS、RDS)。 根据以上三点,以下代码就出炉了:

代码语言:javascript
复制
// 定义父类,名字是自己取的class Product {}
// 定义子类ECS继承了父类Productclass ECS extends Product {}
// 定义子类RDS继承了父类Productclass RDS extends Product {
}

4、现在父类还没属性,将商品共有的已知属性 ID(id), 地域(region), 名称(name)放到父类Product中,记得这里属性是需要通过接收参数赋值的,否则后面就没法玩了。

代码语言:javascript
复制
// 定义父类,名字是自己取的class Product {    // 通过构造器接收属性值_id、_region、_name    constructor(_id, _region, _name) {        // 增加ID属性        this.id = _id;        // 增加地域(region)属性        this.region = _region;        // 增加名称(name)属性        this.name = _name;    }}

5、为子类ECS添加实例(instance)属性

代码语言:javascript
复制
// 定义子类ECS继承了父类Productclass ECS extends Product {    // 接收通用属性_id,_region,_name与独有的实例(instance)属性    constructor(_id, _region, _name, _instance) {        // 将通用属性传递给父类        super(_id, _region, _name);        // 增加实例(instance)属性        this.instance = _instance;    }}

6、为子类RDS添加数据库类型(dbType)属性

代码语言:javascript
复制
// 定义子类RDS继承了父类Productclass 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。我们发现这些可选值比较长,为了预防手拼出现错误,咱们可以将这些可选值放到一个字面量对象当中:

代码语言:javascript
复制
// 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即可:

代码语言:javascript
复制
 // 返回所有成员变量config(){    return this;}

9、buy() 返回一个URL,格式为每个产品的所有成员变量。我们可以将产品所有的成员变量进行拼接即可,父类添加方法buy:

代码语言:javascript
复制
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、完整代码:

代码语言:javascript
复制
// 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继承了父类Productclass ECS extends Product {    // 接收通用属性_id,_region,_name与独有的实例(instance)属性    constructor(_id, _region, _name, _instance) {        // 将通用属性传递给父类        super(_id, _region, _name);        // 增加实例(instance)属性        this.instance = _instance;    }}
// 定义子类RDS继承了父类Productclass RDS extends Product {    // 接收通用属性_id,_region,_name与独有的数据库类型(dbType)属性    constructor(_id, _region, _name, _dbType) {        // 将通用属性传递给父类        super(_id, _region, _name);        // 增加数据库类型(dbType)属性        this.instance = _dbType;    }}

11、测试下是否OK:

代码语言:javascript
复制
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.largeconsole.log(_ecs.buy());// 输出:https://www.aliyun.com/buy?id=2&region=tj&name=rds&instance=mssqlconsole.log(_rds.buy());
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 张培跃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路:
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档