欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript面向对象学习之类的创建,类的抽象代码实例讲解

程序员文章站 2022-05-07 21:26:00
ES5 /*类的创建*/ function Dog() { //构造函数:人们一致协定把构造函数的名字(即类名),首字母大写,以便区分 this...

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的一个属性;  
}