JavaScript的面向对象编程

最终产品图片
您将要创造的

您是否熟悉“意大利面代码”一词? 您可能会听到非JavaScript开发人员批评该语言的隐喻。 它是没有结构的代码。 它由一行一行的语句组成。 有些可能包装在函数中,有些根本没有。 如果幸运的话,所有9,000行代码都将保存在一个文件中。 这种“意大利面条”结构可能是过程编程的结果。

在过程编程中,函数用于执行任务。 我们需要功能,但是我们也需要可以使用的设计。 尽管意大利面非常适合作为晚餐,但并不是为了编写代码。 解毒剂是面向对象的程序设计。 为了理解面向对象的程序设计,我们将介绍设计程序,定义类和创建对象。

设计程序

假设您被分配了为书店创建应用程序的任务。 只是为了好玩,让我们叫我们的书店亚马逊。 亚马逊将有书。 将会有书评。 我们希望按作者查找书籍。 我们将要在我们的应用程序中实现更多功能,但这已经足够了。

面向对象的编程以创建对象为中心。 那么,我们如何将这些需求转换为对象呢? 一种技术是从我们的描述中列出名词,然后将其精简为与问题相关的名词。 我们在问题中提到了以下名词:

  • 应用
  • 书店
  • 图书
  • 评论
  • 作者

应用程序是不相关的名词,因此可以丢弃。 我们也可以摆脱书店,因为它类似于应用程序。 如果我们需要在多个书店做某事,那么我们可以保留它。 我们剩下的书,评论和作者。 (作者已被多元化,因为在此应用程序中我们将有多位作者。)

现在让我们看一下如何设计每个类。 类是用于创建对象的蓝图。 我们创建的书籍类将为我们提供创建书籍对象的蓝图。

这类似于建筑师如何使用蓝图创建房屋。 该蓝图将显示卧室,浴室,厨房和客厅。 这个蓝图可以建造许多房屋。 但是,它们不必都相同。 例如,可以通过更改油漆,地板或固定装置来定制每个房屋。

任务

编写将用于购物车程序的类。 购物车应该能够执行以下操作:

  1. 持有物品清单。
  2. 从购物车中添加和删除物品。
  3. 计算购物车的总数。
  4. 获取客户信息。
  5. 创建采购收据。

班级

要设计我们的书本课,我们需要考虑该课负责什么知识以及做什么。 对于一本书,我们需要知道书名,作者和ISBN。 这些是我们的数据属性。

该类将需要做的一些事情是获取和设置标题,获取和设置作者以及获取和设置ISBN。 这些将是该类的方法。 根据我们的要求,这是我们的书本类的样子:

class Book {
    constructor(title, author, isbn){
        this.title = title;
        this.author = author;
        this.isbn = isbn;
    }

    getTitle(){
        return this.title;
    }
    
    setTitle(newTitle){
        this.title = newTitle;
    }
    
    getAuthor(){
        return this.author;
    }
    
    setAuthor(newAuthor){
        this.author = newAuthor;
    }
    
    getIsbn(){
        return this.isbn;
    }
    
    setIsbn(newIsbn){
        this.isbn = newIsbn;
    }
}

按照惯例,类名大写。 构造函数是一个特殊的函数,用于声明和初始化数据属性。 在构造函数内部,使用this关键字添加属性。 接下来,列出该类的任何方法而没有任何分隔符。

get开头的方法称为访问器方法,因为它们返回一个值。 以set开头的方法是mutator方法,因为它们存储值或更改属性的值。

这是定义类的一般形式:

class ClassName {
    constructor(...args){
        this.attr = arg1;
        this.attr2 = arg2;
        ...
    }
    
    methodOne(){...}
    
    methodTwo(){...}
}

也可以使用以下语法声明类:

const ClassName = class {
    ...
}

类也可以具有静态方法。 静态方法是属于类而不是对象的属性的方法。 假设我们要为我们的book类创建一个静态方法来生成id。 这是语法:

class Book {
    constructor(){
        ...
    }
    
    static generateId(){
        ...
    }
}

调用方法:

Book.generateId();

一个自然的问题是何时以及为什么要使用静态方法? 我不能说我知道使用静态方法的充分理由。 这取决于您如何设计课程。 可以将静态方法用作对象的辅助方法,但是可以将此类函数存储在自己的类中。 如果您知道一个好的用例,请在评论中留下您的想法。

最后,对于组织而言,您应该将类​​存储为模块。 模块只是包含您的代码的文件。 为了使我们的书籍类成为一个模块,我们在其前面添加了一个export语句。

export class Book {
    ...
}

要在另一个文件中使用Book类,我们将其导入。

import { Book } from Book

{ }包含从模块导出的值,而from Book导出的是对文件Book.js的引用。

任务

定义作者和评论的类。

对象

除非我们对此进行某些操作,否则类本身对我们是无用的。 我们要创建书籍。 为此,我们必须实例化该类。 实例化是用于创建新对象的技术术语。 我们将从类创建的对象称为实例。 这是我们创建书的新实例的方式:

let book = new Book("Great Expectations", "Charles Dickens", 1234);
book.getTitle()    //Great Expectations

必须使用new运算符实例化对象。 传递给对象的数据是我们在构造函数中定义的参数。 这是实例化类的一般形式:

variableName = new ClassName(..args);

假设我们要向图书类添加属性,例如ID,价格和库存数量。 现在,我们的构造函数中有六个参数,这并不漂亮。 不仅看不好。 这为使用类的开发人员增加了额外的精力,因为他们必须知道参数的顺序。 更好的解决方案是将一个对象作为参数传递。 例:

class Book {
    constructor(data){
        this.id = data.id;
        this.title = data.title;
        this.author = data.author;
        this.isbn = data.isbn;
        this.units = data.units;
        this.price = data.price;
    }
    
    getTitle(){
        return this.title;
    }
    ...
}

实例化对象:

let data = {
    id: 1,
    title: "Great Expectations",
    author: "Charles Dickens",
    isbn: 1234,
    units: 10,
    price: 29.95
}

let book = new Book(data);

在我们的示例中,我们还可以使用语句book.title访问标题,因为该类中的所有属性都是公共的。 现在您可能想知道为什么如果我们可以直接访问属性,那么为什么我创建了所有这些方法。 只是为了向您显示语法? 是。 另外,我想展示以这种方式组织代码的好处。

将相关代码捆绑到一个对象中称为封装。 封装的好处之一是数据隐藏。 数据隐藏意味着无法在类外部访问对象的属性。

在其他语言(例如Java和Python)中,我们可以具有私有属性和私有方法。 因为默认情况下,我们的所有数据在JavaScript类中都是公共的,所以我们无法利用此功能。 不过,我们应该使用getter和setter访问数据。 一种约定是在属性下加下划线_表示该属性是私有的。

任务

创建一个使用author对象设置author属性的book对象。

最后的想法

我们了解到,类是创建对象的蓝图,而对象是类的实例。 将软件构建到对象中的好处在于,它可以提供程序结构并使其更易于管理。

当我们有一个大型程序时,将其分解为多个对象可以使零件的开发和维护独立于其他零件。 这种模块化带来了可重用性。 因为我们的代码是封装的,所以可以在程序的其他部分中反复使用这些对象。 另外,我们有一个可测试的代码单元。 我们的代码测试得越好,就越容易避免错误。

进一步阅读

翻译自: https://code.tutsplus.com/articles/Object-Oriented-Programming-JavaScript--cms-29256

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值