JS面向对象编程浅析

yizhihongxing

JS面向对象编程浅析

在JavaScript中,面向对象编程(Object-Oriented Programming,OOP)是一种非常常见的编程思想。OOP的核心概念是“对象”,它可以把一系列的数据和行为聚合在一起,形成一个具有特定功能的“物体”。本文将会从以下几点详细讲解JavaScript面向对象编程的相关知识。

面向对象的基本概念

类和对象

类(Class)是对象集合的抽象表示形式,具有相似特征、相同行为的对象集合。在JavaScript中,类是由构造函数(Constructor)创建的。构造函数是一种特殊的函数,用来初始化对象的属性和方法,其名称通常以大写字母开头。例如:

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function() {
    console.log("Hello, my name is " + this.name + ", I'm " + this.age + " years old.");
  }
}

在上述代码中,我们用构造函数Person创建了一个Person类。这个类包含两个属性(name和age)和一个方法(sayHello),方法用来输出对象的信息。在JavaScript中,我们可以使用new关键字来创建对象。例如:

var person1 = new Person("Bob", 20);
var person2 = new Person("Tom", 22);
person1.sayHello(); // Hello, my name is Bob, I'm 20 years old.
person2.sayHello(); // Hello, my name is Tom, I'm 22 years old.

在上述代码中,我们使用Person类创建了两个对象(person1和person2),并调用每个对象的sayHello方法输出对象的信息。

封装、继承和多态

面向对象编程中的三大特征是封装、继承和多态。

封装(Encapsulation)是指将对象的属性和方法隐藏起来,保护数据不被外部直接访问。封装是对象的基础,可以使对象的使用更加安全和方便。

继承(Inheritance)是指从父类(或超类)派生出子类(或子类型),子类会自动拥有父类的属性和方法,同时可以添加自己的属性和方法。继承可以简化代码的编写,提高代码的可重用性。

多态(Polymorphism)是指不同的对象可以响应同一个消息,并表现出不同的行为。它是面向对象编程中最具有灵活性和扩展性的特征之一。

JavaScript中实现面向对象编程

实现面向对象编程的方法有很多,在JavaScript中实现OOP最常见的方法是使用构造函数和原型链。这一小节我们将详细讲解这种方法。

构造函数

在JavaScript中,我们可以使用构造函数创建对象。概括来说,构造函数是一个普通的函数,可以使用new关键字来创建一个对象。例如:

function Animal(name) {
  this.name = name;
  this.sayName = function() {
    console.log("My name is " + this.name);
  }
}
var dog = new Animal("dog");
dog.sayName(); // My name is dog

在上述代码中,我们创建了一个Animal类,包含一个属性(name)和一个方法(sayName)。然后使用new关键字来创建一个dog对象,并调用这个对象的sayName方法输出dog对象的名称。

原型链

在JavaScript中,每个对象都有一个原型(prototype)属性,原型定义了属性和方法的集合。对象可以通过原型链访问到这些属性和方法。原型链是一种对象之间的链接方式,使得一个对象可以通过另一个对象克隆所有的属性和方法。

  • 使用原型

我们可以使用Object.create方法来创建原型对象,并使用原型对象创建对象。例如:

var animal = {
  name: "",
  sayName: function() {
    console.log("My name is " + this.name);
  }
};
var dog = Object.create(animal);
dog.name = "dog";
dog.sayName(); // My name is dog

在上述代码中,我们使用Object.create方法创建了一个名为animal的原型对象,并在原型对象中定义了一个属性(name)和一个方法(sayName)。然后我们使用原型对象创建了一个dog对象,并为dog对象的name属性赋值。最后调用这个对象的sayName方法输出对象的名称。

  • 直接在原型对象中定义属性和方法

我们也可以直接在构造函数的原型对象中定义属性和方法。例如:

function Animal(name) {
  this.name = name;
}
Animal.prototype.sayName = function() {
  console.log("My name is " + this.name);
}
var dog = new Animal("dog");
dog.sayName(); // My name is dog

在上述代码中,我们定义了一个Animal类,并在Animal类的原型对象中添加了一个方法(sayName)。然后使用new关键字创建一个dog对象,并调用这个对象的sayName方法输出对象的名称。

示例说明

示例一

一家公司有多个员工,公司想对每个员工进行薪资管理。每个员工有姓名和工资两个属性,需要按照不同的算法计算工资。例如,普通员工每天的工资是基本工资加班费,经理每个月的工资由基本工资、奖励和补贴组成,销售员的工资由基本工资和销售提成组成。请用面向对象的思想设计出一个薪资管理系统。

设计思路

在这个案例中,我们可以设计一个基础的Employee类,包含员工的姓名和工资属性。然后定义三个子类(Manager,Salesman,Worker)分别表示经理、销售员和普通员工。每个子类可以继承Employee类,同时定义自己的工资计算算法。

代码实现

function Employee(name, salary) {
  this.name = name;
  this.salary = salary;
}
Employee.prototype.getSalary = function() {
  return this.salary;
}
function Manager(name, salary, reward, allowance) {
  Employee.call(this, name, salary);
  this.reward = reward;
  this.allowance = allowance;
}
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.getSalary = function() {
  return this.salary + this.reward + this.allowance;
}
function Salesman(name, salary, commission) {
  Employee.call(this, name, salary);
  this.commission = commission;
}
Salesman.prototype = Object.create(Employee.prototype);
Salesman.prototype.constructor = Salesman;
Salesman.prototype.getSalary = function() {
  return this.salary + this.commission;
}
function Worker(name, salary, overtimePay) {
  Employee.call(this, name, salary);
  this.overtimePay = overtimePay;
}
Worker.prototype = Object.create(Employee.prototype);
Worker.prototype.constructor = Worker;
Worker.prototype.getSalary = function() {
  return this.salary + this.overtimePay;
}

在上述代码中,我们定义了一个Employee类表示员工,包含name和salary属性。然后定义了三个子类,分别为Manager、Salesman和Worker。这三个子类都继承了Employee类,同时定义了自己的getSalary方法来计算工资。

示例二

设计一个Person类表示人,包含name、age、gender三个属性和一个sayHello方法,该方法可以输出“I'm {name}, I'm {age} years old, I'm {gender}” 的语句。然后定义两个子类(Student和Teacher),分别包含major属性(表示专业)和subject属性(表示教授科目)。

设计思路

在这个案例中,我们可以设计一个基础的Person类,包含name、age和gender三个属性和一个sayHello方法。然后定义两个子类(Student和Teacher),分别继承Person类,同时增加自己的属性。Student类增加了major属性,Teacher类增加了subject属性。

代码实现

function Person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}
Person.prototype.sayHello = function() {
  console.log("I'm " + this.name + ", I'm " + this.age + " years old, I'm " + this.gender);
}
function Student(name, age, gender, major) {
  Person.call(this, name, age, gender);
  this.major = major;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
function Teacher(name, age, gender, subject) {
  Person.call(this, name, age, gender);
  this.subject = subject;
}
Teacher.prototype = Object.create(Person.prototype);
Teacher.prototype.constructor = Teacher;

在上述代码中,我们定义了一个Person类,包含name、age和gender三个属性和一个sayHello方法。然后定义了两个子类,Student和Teacher,每个子类继承了Person类,同时定义了自己的属性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面向对象编程浅析 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • JS中switch的四种写法示例

    下面我将详细讲解JS中switch的四种写法示例。 简述 switch是一个条件语句,用于测试变量是否等于多个值中的某一个值。在JS中,switch有四种使用方式,分别是: 没有 break 关键字; 有 break 关键字; 每个 case 都使用 return; 使用对象的方法进行判断。 没有 break 关键字 示例代码如下: var myAnswer…

    JavaScript 2023年5月28日
    00
  • 详解从Vue-router到html5的pushState

    详解从Vue-router到html5的pushState 背景介绍 Vue-router 是 Vue.js 官方提供的路由管理器。它和Vue.js 完全集成,支持HTML5历史模式或hash模式,在前端路由中使用非常方便,同时也支持动态路由、嵌套路由和编程式路由等高级功能。 要深入了解Vue-router,首先需要了解什么是前端路由操作,以及 HTML5 …

    JavaScript 2023年6月11日
    00
  • 微信小程序收货地址API兼容低版本解决方法

    微信小程序收货地址API兼容低版本解决方法的攻略如下: 问题描述 随着微信的版本升级,小程序中的API也在不断更新。在微信版本7.0.0及以上,小程序新增了获取用户收货地址的API,可以直接调用wx.chooseAddress()方法获取用户的收货地址信息。但是,如果小程序运行的微信版本低于7.0.0,将会出现报错,导致无法获取收货地址信息。因此,需要兼容低…

    JavaScript 2023年6月11日
    00
  • Ajax中数据传递的另一种模式 javascript Object Notation思想(JSON)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。由于 JSON 具有比 XML 更加简单、更加易读、更加易于书写,越来越多的 Web 服务开始采用 JSON 作为数据交换的标准格式。 JSON 的基本语法格式为键值对,即“key:value”格式,用“{}”表示一个对象,用“[]”表示数组,JSON中的数据类型支持…

    JavaScript 2023年5月19日
    00
  • TypeScript命名空间讲解

    TypeScript命名空间讲解 在 TypeScript 中可以使用命名空间来避免命名冲突,它们可以将代码划分为逻辑上相近的部分。命名空间可以帮助我们组织代码并减少全局命名冲突。 命名空间的定义 在 TypeScript 中,命名空间使用 namespace 关键字进行定义。 namespace MyNamespace { // 这里放命名空间中的代码 }…

    JavaScript 2023年6月10日
    00
  • Javascript中的对象属性是有序的吗

    在JavaScript中,对象可以定义为一组无序的属性集合。每个属性由一个键(key)和一个值(value)组成。但是,对象属性的顺序背后是有一定规则的。 实际上,JavaScript中的对象属性是无序的。这意味着添加对象属性的顺序并不重要,因为它们在对象中的顺序不是固定的。这与Python中的字典类似,也是无序的。 但是,如果你在JavaScript中使用…

    JavaScript 2023年5月27日
    00
  • javascript数组常用方法汇总

    JavaScript数组常用方法汇总 本文介绍了JavaScript中数组常用的方法,包括:push、pop、shift、unshift、concat、slice、splice、indexOf、lastIndexOf、join、toString、reverse、sort、filter、map、reduce。以下是每个方法的详细说明: push push()方…

    JavaScript 2023年5月27日
    00
  • Cordova(ionic)项目实现双击返回键退出应用

    要实现双击返回键退出应用,需要在 Cordova (或 Ionic)应用中添加相关代码。下面是实现过程的完整攻略。 步骤一:安装插件 在 Cordova 应用中,需要使用 cordova-plugin-exitapp 插件来实现双击返回键退出应用的功能。可以使用以下命令安装该插件: cordova plugin add cordova-plugin-exit…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部