题目:阿里云产品线十分丰富,拥有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继承了父类Productclass ECS extends Product {}
// 定义子类RDS继承了父类Productclass 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继承了父类Productclass ECS extends Product { // 接收通用属性_id,_region,_name与独有的实例(instance)属性 constructor(_id, _region, _name, _instance) { // 将通用属性传递给父类 super(_id, _region, _name); // 增加实例(instance)属性 this.instance = _instance; }}
6、为子类RDS添加数据库类型(dbType)属性
// 定义子类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。我们发现这些可选值比较长,为了预防手拼出现错误,咱们可以将这些可选值放到一个字面量对象当中:
// 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继承了父类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:
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.largeconsole.log(_ecs.buy());// 输出:https://www.aliyun.com/buy?id=2®ion=tj&name=rds&instance=mssqlconsole.log(_rds.buy());