浅谈javascript面向对象程序设计

浅谈JavaScript面向对象程序设计

什么是面向对象编程

面向对象编程(OOP)是一种编程模式,它将现实世界中的事物抽象为类,类与类之间进行交互与协作,通过封装、继承、多态等机制使得程序结构更加清晰、易于扩展与维护。

JavaScript中的面向对象

在JavaScript中,函数是一等公民,对象可以作为函数的参数或返回值,JavaScript中的面向对象编程依托于函数、原型和构造函数等特性实现,以下简单介绍几个常见的特性。

封装

封装是一种将数据和操作封装在对象中,对外部隐藏内部实现的机制。JavaScript中,可以使用闭包来实现封装,代码示例如下:

function Person(name, age) {
  var _name = name;
  var _age = age;

  this.getName = function() {
    return _name;
  }

  this.getAge = function() {
    return _age;
  }

  this.setName = function(name) {
    _name = name;
  }

  this.setAge = function(age) {
    _age = age;
  }
}

var person = new Person('张三', 20);

console.log(person.getName()); // 输出:张三
console.log(person.getAge()); // 输出:20

person.setName('李四');
person.setAge(30);

console.log(person.getName()); // 输出:李四
console.log(person.getAge()); // 输出:30

在上述代码中,Person函数通过闭包实现了封装,外部无法直接访问对象的_name和_age属性,只能通过getName、getAge、setName和setAge方法来获取或修改。

继承

继承是一种实现代码重用和扩展的机制。JavaScript中可以使用原型链来实现继承,代码示例如下:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.getName = function() {
  return this.name;
}

Person.prototype.getAge = function() {
  return this.age;
}

function Student(name, age, grade) {
  Person.call(this, name, age); // 调用父类构造函数,设置name和age属性
  this.grade = grade;
}

Student.prototype = Object.create(Person.prototype); // 建立原型链,将Student的原型指向Person的原型
Student.prototype.constructor = Student; // 修正Student的构造函数指向自身

Student.prototype.getGrade = function() {
  return this.grade;
}

var student = new Student('张三', 20, 90);

console.log(student.getName()); // 输出:张三
console.log(student.getAge()); // 输出:20
console.log(student.getGrade()); // 输出:90

在上述代码中,Student继承了Person的属性和方法,并通过原型链实现了继承。

多态

多态是一种同一种操作作用于不同的对象上面时,可以产生不同的执行结果的机制。在JavaScript中,可以通过重写父类方法和使用instanceof来实现多态,代码示例如下:

function Animal() {}

Animal.prototype.say = function() {
  console.log('动物叫');
}

function Dog() {}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.say = function() {
  console.log('汪汪汪');
}

function Cat() {}

Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

Cat.prototype.say = function() {
  console.log('喵喵喵');
}

var animal = new Animal();
var dog = new Dog();
var cat = new Cat();

animal.say(); // 输出:动物叫
dog.say(); // 输出:汪汪汪
cat.say(); // 输出:喵喵喵

function shout(animal) {
  if(animal instanceof Animal) {
    animal.say();
  } else {
    console.log('非动物对象无法叫!');
  }
}

shout(animal); // 输出:动物叫
shout(dog); // 输出:汪汪汪
shout(cat); // 输出:喵喵喵
shout('hello'); // 输出:非动物对象无法叫!

在上述代码中,通过重写Animal的say方法和使用instanceof来实现了多态。

示例说明

示例一:封装

下面是一个使用闭包封装一个计数器的代码示例:

function Counter() {
  var count = 0;

  this.increment = function() {
    count++;
  }

  this.getCount = function() {
    return count;
  }
}

var counter = new Counter();

counter.increment();
counter.increment();
counter.increment();

console.log(counter.getCount()); // 输出:3

在上述示例中,使用闭包将计数器的count属性封装在Counter函数内,外部只能通过increment和getCount方法来操作计数器。

示例二:继承

下面是一个使用原型链实现继承的代码示例:

function Shape(x, y, color) {
  this.x = x;
  this.y = y;
  this.color = color;
}

Shape.prototype.getPos = function() {
  return '(' + this.x + ', ' + this.y + ')';
}

Shape.prototype.getArea = function() {}

function Circle(x, y, r, color) {
  Shape.call(this, x, y, color); // 调用父类构造函数,设置x、y和color属性
  this.r = r;
}

Circle.prototype = Object.create(Shape.prototype); // 建立原型链,将Circle的原型指向Shape的原型
Circle.prototype.constructor = Circle; // 修正Circle的构造函数指向自身

Circle.prototype.getArea = function() {
  return Math.PI * this.r * this.r;
}

var circle = new Circle(0, 0, 5, 'red');

console.log(circle.getPos()); // 输出:(0, 0)
console.log(circle.getArea()); // 输出:78.53981633974483

在上述示例中,使用原型链将Circle继承了Shape的属性和方法。

总结

本文简单介绍了JavaScript中面向对象编程的特性,包括封装、继承、多态等,同时给出了使用闭包和原型链实现封装和继承的代码示例。面向对象编程是一种重要的程序设计模式,学习和掌握面向对象编程对于编写优秀的JavaScript程序非常重要。

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

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

相关文章

  • 由Javascript实现的页面日历

    下面是由Javascript实现的页面日历的完整攻略: 1.准备HTML和CSS 首先,在HTML中创建一个容器用于包含整个日历,然后为日历添加CSS样式以控制其外观。以下是一个示例: <div id="calendar"></div> #calendar { width: 300px; height: 300px…

    JavaScript 2023年6月10日
    00
  • 前端设计模式——外观模式

    外观模式(Facade Pattern):它提供了一个简单的接口,用于访问复杂的系统或子系统。通过外观模式,客户端可以通过一个简单的接口来访问复杂的系统,而无需了解系统内部的具体实现细节。 在前端开发中,外观模式常常被用于封装一些常用的操作,以简化代码复杂度和提高代码可维护性。比如,一个用于处理数据的模块可能包含很多复杂的代码逻辑和 API 调用,但是我们可…

    JavaScript 2023年4月18日
    00
  • JavaScript高级程序设计 客户端存储学习笔记

    以下是JavaScript高级程序设计 客户端存储学习笔记的完整攻略。 一、前言 JavaScript高级程序设计 客户端存储学习笔记是指一本介绍客户端存储技术(如Cookie、Web Storage、IndexDB等)的书籍,笔者整理了该书的学习笔记,详细说明了内容和用法。 二、章节概述 本书一共包含5个章节,分别是: 状态管理与客户端存储 Cookie详…

    JavaScript 2023年5月27日
    00
  • Javascript MAX_VALUE 属性

    以下是关于JavaScript MAX_VALUE属性的完整攻略。 JavaScript MAX_VALUE属性 JavaScript MAX_VALUE属性是Number对象的一个属性,它表示JavaScript中最大的数值为1.79E+308。MAX_VALUE属性是常量,它不能被修改。 下面是一个使用MAX_VALUE属性的示例: console.lo…

    JavaScript 2023年5月11日
    00
  • JS正则获取HTML元素的方法

    当我们在开发Web应用时,经常需要在DOM中根据正则表达式来查找和获取特定的HTML元素。如何使用JavaScript正则表达式来处理DOM的HTML元素呢?下面是一些方法: 使用JavaScript内置函数来获取HTML元素 JavaScript通过document对象来表示整个HTML文档。document对象上使用的内置函数可以轻松地获取DOM元素。通…

    JavaScript 2023年6月10日
    00
  • javascript实现鼠标点击页面 移动DIV

    实现鼠标点击页面移动DIV可以通过JavaScript来完成,这需要监听鼠标的事件,在事件中获取鼠标的坐标位置,然后动态修改DIV元素的位置。下面是完整的实现攻略: 监听鼠标事件 通过addEventListener方法,可以为页面添加鼠标事件监听器,捕获鼠标事件并在事件处理程序中处理。下面是一个简单的示例代码: document.addEventListe…

    JavaScript 2023年6月11日
    00
  • javascript 流畅动画实现原理

    JavaScript 实现流畅动画的原理是通过不断地更新元素的位置或样式来实现视觉上的连续性,使元素看起来像是在不断地移动或变化。 常见的实现流畅动画的方式是通过 setInterval 或 requestAnimationFrame 不断地调用函数,来更新元素的位置或样式。在函数中,可以通过改变元素的 CSS 属性,来实现实时更新元素的效果。 其中,使用 …

    JavaScript 2023年6月10日
    00
  • javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第2/2页

    需要注意的是,JavaScript使用ActiveXObject控件需要在IE浏览器环境下操作,而且需要注意安全性问题。 创建Word对象 使用ActiveXObject控件来操作Word,首先需要创建一个Word对象。可以通过以下代码来实现: var wordApp = new ActiveXObject("Word.Application&qu…

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