JavaScript 面向对象与原型

JavaScript 面向对象与原型

什么是面向对象?

面向对象编程(Object-oriented programming, OOP)是一种编程模式,它以“对象”作为程序的基本单元,通过对象之间的交互实现程序功能。面向对象编程思想中,将程序拆分成若干个模块,每个模块相当于一个对象,包含自身属性和方法。

JavaScript作为一门面向对象的语言,与其他语言不同,它没有类的概念。在JavaScript中,对象是由“原型”构建而来的。

原型

原型(Prototype)是JavaScript面向对象编程的基础。我们可以将原型理解为每个对象都拥有的一个属性,在JavaScript中,每种数据类型都拥有一个原型。原型即该数据类型的模板,它包含了该类型所有的方法和属性,同时又与该类型的所有对象共享。

构造函数

在JavaScript中,我们可以使用构造函数来定义一个类,并且在构造函数中设置原型对象中的属性和方法。下面是一个简单的示例:

function Person(name, age) {
  // 在构造函数内部定义属性
  this.name = name;
  this.age = age;
}
// 在构造函数的原型对象中定义方法
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}

// 创建一个实例对象
const person = new Person('Alice', 20);
person.sayHello(); // Hello, my name is Alice, I'm 20 years old.

在这个示例中,我们定义了一个Person构造函数,它接收两个参数,分别代表一个人的名字和年龄。在Person构造函数中,我们通过this.name = namethis.age = age这样的方式来定义实例对象的属性。同时,我们通过Person.prototype.sayHello = function() {...}的方式在构造函数的原型对象中定义了一个sayHello方法,该方法可以在实例对象上进行调用。

需要注意的是,构造函数的命名习惯是使用大写字母开头,这样可以方便的与实例对象进行区分。

原型链

实际上,每个JavaScript对象都有一个原型。这个原型又是一个JavaScript对象,它的原型又是另一个JavaScript对象,以此类推,直到原型链的顶端为止。原型链的顶端是由所有对象共享的,通常是Object的原型对象。

在查找一个对象的属性时,JavaScript会先在该对象本身的属性中查找,如果没有找到,则会往上沿着原型链查找,直到找到或到达原型链的顶端。这就是JavaScript中“原型链”的概念。

我们可以通过Object.getPrototypeOf()方法查看一个对象的原型,例如:

const obj = {};
console.log(Object.getPrototypeOf(obj)); // 输出:[object Object]

原型继承

通过原型继承,一个对象可以继承另一个对象的属性和方法。在JavaScript中,我们可以通过Object.create()方法创建一个新对象,并将其原型设置为指定对象的原型。下面是一个简单的示例:

const person = {
  name: 'Alice',
  age: 20,
  sayHello() {
    console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
  }
};
const student = Object.create(person);
student.major = 'Computer Science';

console.log(student.name); // Alice
console.log(student.age); // 20
console.log(student.major); // Computer Science
student.sayHello(); // Hello, my name is Alice, I'm 20 years old.

在这个示例中,我们先创建了一个包含nameagesayHello属性的对象person,然后通过Object.create()方法创建了一个新的对象student,将其原型设置为person的原型。在student对象上,我们还添加了一个major属性。

通过student.namestudent.agestudent.sayHello()都可以访问到person对象的属性和方法。

示例说明

示例1

假设我们在开发一个游戏,每个角色都有贡献值和攻击力,现在需要定义一个角色类,包含角色的基本属性和方法。

function Role(contribute, attack) {
  this.contribute = contribute;
  this.attack = attack;
}
Role.prototype.setContribute = function(contribute) {
  this.contribute = contribute;
}
Role.prototype.getContribute = function() {
  return this.contribute;
}
Role.prototype.setAttack = function(attack) {
  this.attack = attack;
}
Role.prototype.getAttack = function() {
  return this.attack;
}

const role1 = new Role(100, 10);
role1.setContribute(50);
console.log(role1.getContribute()); // 50
console.log(role1.getAttack()); // 10

在这个示例中,我们定义了一个Role构造函数,它包含contributeattack属性,并定义了一些设置和获取属性的方法。在role1实例上,我们先通过new Role(100, 10)的方式创建了一个对象,并将其属性设置为10010。然后,通过setContribute(50)的方式修改了contribute属性,最后通过getContribute()getAttack()方法输出了属性。

示例2

我们再来一个稍微复杂一点的示例,假设现在有一个形状的类,可以通过setSides()方法设置边数,通过getSides()方法获取边数,同时有一个子类Square,它继承自Shape,并具有计算面积的能力。

function Shape(sides) {
  this.sides = sides;
}
Shape.prototype.setSides = function(sides) {
  this.sides = sides;
}
Shape.prototype.getSides = function() {
  return this.sides;
}

function Square(sides, length) {
  Shape.call(this, sides); // 继承Shape类的属性
  this.length = length;
}
Square.prototype = Object.create(Shape.prototype); // 继承Shape类的方法
Square.prototype.getArea = function() {
  return this.length * this.length;
}

const square1 = new Square(4, 10);
console.log(square1.getSides()); // 4
console.log(square1.getArea()); // 100

在这个示例中,我们定义了ShapeSquare两个类。Shape类包含sides属性和设置和获取属性的方法。Square类继承了Shape类,并且在其原型对象中添加了一个getArea()方法,用于计算正方形的面积。

square1实例上,我们先通过new Square(4, 10)的方式创建了一个正方形对象,并将其属性设置为410。然后,通过getSides()方法获取了边数,并通过getArea()方法计算出正方形的面积。

这里需要注意的是,在Square类中,我们通过Shape.call(this, sides)的方式继承了Shape类的属性,使用Object.create(Shape.prototype)的方式继承了Shape类的方法。这样,我们就可以在Square对象上调用Shape中定义的属性和方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 面向对象与原型 - Python技术站

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

相关文章

  • 使用JavaScript保存文本文件到本地的两种方法

    下面是使用JavaScript保存文本文件到本地的两种方法的详细攻略: 1. 使用Blob对象保存文本文件 Blob对象简介 Blob是Binary Large Object的缩写,表示二进制大对象。它是一种类文件对象,可以存储任意的二进制数据,如图片、视频、文本等。我们可以利用Blob对象来保存文本文件到本地。 实现步骤 创建Blob对象:可以使用Blob…

    JavaScript 2023年5月27日
    00
  • 理解JavaScript中的事件

    下面是详细讲解“理解JavaScript中的事件”的完整攻略。 什么是事件? 事件是指用户在网页上进行操作时,浏览器自动识别的行为,比如鼠标的点击、移动,键盘的按下、松开等。JavaScript中的事件是指用户在网页上的操作行为,我们可以通过JavaScript代码来定义这些操作行为,让网页在用户进行某些操作时自动触发代码来实现一些特定的功能。 JavaSc…

    JavaScript 2023年6月10日
    00
  • 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    接下来我将详细讲解“判断js中各种数据的类型方法之typeof与Object.prototype.toString讲解”。 typeof与Object.prototype.toString的差别 在 Javascript 中,判断一个值的类型通常使用 typeof 操作符和 Object.prototype.toString 方法,二者在实际开发中常常被用来…

    JavaScript 2023年6月10日
    00
  • JavaScript基础之对象

    JavaScript基础之对象 在JavaScript中,对象是一种数据类型,其中包含了一组属性和方法,每个属性都有一个值。对象可以通过字面量形式进行创建,也可以通过构造函数进行创建。 对象的创建 字面量创建对象 使用字面量可以很方便地创建一个对象,字面量由一对花括号“{}”表示,对象属性和值之间使用冒号分隔,属性之间使用逗号分隔。 let person =…

    JavaScript 2023年5月18日
    00
  • JavaScript中常见加密解密方法总结

    JavaScript中常见加密解密方法总结 在前端开发中,加密和解密是常用的技术手段之一,它们可以保证前端传递的数据安全性。本文将介绍一些常见的JavaScript加密和解密方法。 Base64编码解码 Base64编码是将二进制数据转化为纯文本的一种编码方式。在前端传递数据时,常常需要对敏感信息进行编码,以保证数据的安全。 以下是一个简单的示例,演示如何使…

    JavaScript 2023年5月19日
    00
  • 纯jsp实现的倒计时动态显示效果完整代码

    下面是实现纯jsp实现的倒计时动态显示效果完整代码攻略。 1. 实现原理 倒计时动态显示效果的实现原理是通过js倒计时功能实现动态效果,然后将倒计时的时间以jsonp格式传递到服务器端,服务器端通过jsp读取到jsonp数据并通过JSTL表达式解析并进行动态页面输出,从而实现了倒计时的动态效果,并将显示效果不断地随时间改变。 2. 实现步骤 创建一个html…

    JavaScript 2023年6月11日
    00
  • 微信小程序 连续旋转动画(this.animation.rotate)详解

    当使用微信小程序的时候,可以通过动画来让页面更加生动有趣,其中连续旋转动画就是一个很不错的选择。本文将详细介绍微信小程序的连续旋转动画,包括实现过程,代码示例和一些常见问题的解答。 前置知识 在学习微信小程序的连续旋转动画前,需要掌握一些必要的前置知识: 微信小程序的基础语法; CSS3中transform属性的基本用法; 小程序中使用wx.createAn…

    JavaScript 2023年6月11日
    00
  • JavaScript中的事件循环方式

    JavaScript中的事件循环方式是Web开发中非常重要的一个概念。它决定了JavaScript的执行顺序,是理解异步编程和Promise的重要起点。在本文中,我将逐步介绍JavaScript的事件循环机制。 什么是事件循环 事件循环指的是JavaScript引擎在空闲时,从消息队列中取出一条消息进行处理的过程。在JavaScript中,事件可以是异步操作…

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