JavaScript面向对象学习笔记[类的创建,类的抽象]

学习http://www.cnblogs.com/elonhu/p/6984609.html

ES5

/*类的创建*/

function Dog() {
    //构造函数:人们一致协定把构造函数的名字(即类名),首字母大写,以便区分
    this.hairColor = '白色';
    /*this指向被创造的对象(实例),如果不明白可以简单的理解为给对象(this)赋予hairColor这个属性
     */
    this.breed = '贵宾';
    this.age = 2;
    this.runSpeed = null; //string
    /*属性的声明一定要放在构造函数的最顶部;
    有的属性可能一开始没有初始值,会在方法里才赋值,但你一定要在构造函数里声明一下
    有必要的话再声明一下属性的类型
    */
}
Dog.prototype.shout = function() {
    /*我们把方法追加到构造函数的prototype属性,而不是直接在构造函数里用this.shout = function(){};
    这样的好处是会让Dog创造的所有对象都共享一个方法,从而节约内存;
    一般来说属性在构造函数里赋予,方法在prototype里赋予;
    */
    console.log('汪!汪!汪!我是一只' + this.age + '岁的' + this.hairColor + this.breed);
    //方法里通过this可以访问属性
}

ES6

class Dog {
    constructor(hairColor, breed, age) { //代表这个类的构造函数
        this.hairColor = hairColor; //string
        this.breed = breed; //string
        this.age = age; //number
        this.runSpeed = null; //string
        Dog.instanceNumber++;
    }
    shout() {
        console.log('汪!汪!汪!我是一只' + this.age + '岁的' + this.hairColor + this.breed);
    }
    run() {
        this.runSpeed = '10m/s';
        console.log('吃我灰吧,哈哈!本狗的速度可是有' + this.runSpeed);
    }
    gnawBone() {
        console.log('这是本狗最幸福的时候');
    }
    getInstanceNumber() {
        return Dog.instanceNumber;
    }
}//ES6类的创建就比较舒服了,class把整个类用{}包裹在一起,写法也比较方便。
Dog.instanceNumber = 0;//遗憾的是ES6里也没有规范静态属性,还是跟ES5一样的用法,据说ES7已有一个静态属性的提案
let dog1 = new Dog('白色', '贵宾', 2);
let dog2 = new Dog('棕色', '泰迪', 1);
let dog3 = new Dog('黑色', '土狗', 3);
dog1.shout(); //log: '汪!汪!汪!我是一只2岁的白色贵宾'
dog2.shout(); //log: '汪!汪!汪!我是一只1岁的棕色泰迪'
dog3.shout(); //log: '汪!汪!汪!我是一只3岁的黑色土狗'
console.log(dog1.getInstanceNumber()); //log: 3;

类的抽象

  上面的例子是我们明确知道要创建一个对象(实例)dog,但实际开发当中是没有人告诉我们需要创建哪些对象的,领导给我们的只有需求,所以我们要分析需求的业务逻辑,把需求分解成一个个对象。

  比如说现在领导给我们一个需求:做一个超市收银系统,分为两种角色:收银员和管理员,收银员可以查询物品信息、统计价格、录入账单信息、打印小票,管理员可以查看账单信息、统计账单信息。

  注意需求中的名词:收银员、管理员、物品信息、账单、小票,这些就是天然的对象,这是最初步的抽象。

  让我们再注意动词:查询、统计、录入、打印,我们是不是也可以抽象成对象?查询器?统计器?

  然后我们开始coding吧,不要纠结自己的抽象是否完美,作者很赞同Facebook的一句标语:Done is better than perfect(比完美更重要的是完成).

  当某个对象的代码不断膨胀,慢慢超出控制的时候(作者自己的的标准是一个对象尽量不超过300行代码),这时候你就得考虑更深层次的抽象了,查找这个对象里代码比较多的属性、方法、然后抽象成另一个对象,把新对象作为原先对象的成员(属性)。

function Dog(){
    this._tail = new Tail();//把尾巴tail抽象成另一个对象,作为dog的一个属性;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值