浅谈javascript面向对象程序设计

yizhihongxing

浅谈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日

相关文章

  • php打包网站并在线压缩为zip

    打包网站并在线压缩为zip,可以通过以下步骤完成: 安装zip扩展 首先,需要确保你的PHP环境中已经安装了zip扩展。如果你使用的是Linux系统,在终端中输入以下命令: sudo apt-get install php-zip 如果你使用的是Windows系统,可以通过编辑php.ini文件启用zip扩展。找到php.ini文件中的以下两行代码,去掉前面…

    JavaScript 2023年6月11日
    00
  • JavaScript Array对象使用方法解析

    JavaScript Array对象使用方法解析 概述 JavaScript中的Array对象是一个非常重要的数据结构类型,可以用来存储相同类型的数据,并且可以通过封装在Array对象上的各种方法,方便地进行增、删、改、查等操作。本文将详细地解析JavaScript Array对象的使用方法,包括数组的创建、增删元素、遍历、排序、查找等操作。 数组的创建 方…

    JavaScript 2023年5月27日
    00
  • 一个JavaScript函数把URL参数解析成Json对象

    要把URL参数解析成Json对象,可以使用JavaScript的内置方法URLSearchParams,该方法可用于解析URL查询字符串中的参数。具体步骤如下。 步骤一:获取URL参数字符串 使用window.location.search获取URL的查询字符串,然后去除开头的问号“?”,得到纯参数字符串。 const searchParams = wind…

    JavaScript 2023年5月27日
    00
  • 用 Javascript 验证表单(form)中多选框(checkbox)值

    下面是用 Javascript 验证表单中多选框值的攻略: 1. HTML 布局 首先,我们需要在 HTML 中布局多选框。 <form> <div> <label> <input type="checkbox" name="fruit" value="apple&q…

    JavaScript 2023年6月10日
    00
  • 不刷新网页就能链接新的js文件方法总结

    “不刷新网页就能链接新的JS文件”是通过AJAX技术实现的。基本流程如下: 使用XMLHttpRequest对象定义AJAX请求。 发送AJAX请求到服务器,获取JS文件的内容。 将新的JS代码注入到页面中。 以下是详细的实现步骤: 1. 定义AJAX请求 function loadScript(url, callback) { var xhr = new …

    JavaScript 2023年5月27日
    00
  • JS实现时间选择器

    JS实现时间选择器的攻略需要遵守以下步骤: 1. 准备工作 首先需要在页面中引入需要用到的JS库,例如jQuery或者Zepto。可以通过CDN或者下载本地使用。 2. 创建HTML结构 时间选择器需要一个输入框来显示选中的时间,同时还需要一个弹窗来显示时间选择器控件。HTML结构可以按照以下方式构建: <div class="form-gr…

    JavaScript 2023年5月27日
    00
  • 解决前端跨域问题方案汇总

    让我来为您详细讲解解决前端跨域问题方案汇总的完整攻略。 一、跨域问题简介 跨域(Cross-Origin)是指在浏览器的同源策略下,不同源的服务器无法通信的一种安全机制。同源是指协议、域名和端口号完全相同。 例如: http://www.example.com 与 http://www.example.com/path1 为同源; http://www.ex…

    JavaScript 2023年6月11日
    00
  • 浅谈JavaScript中等号、双等号、 三等号的区别

    浅谈 JavaScript 中等号、双等号、三等号的区别 JavaScript 中等号、双等号、三等号都是用来进行值比较的运算符。但是它们之间有着不同的运算规则,下面我们来一一介绍它们的区别。 等号 = 等号 = 是 JavaScript 中的赋值运算符,用来将一个值赋给一个变量。例如: let a = 10; // 将 10 赋值给变量 a 双等号 == …

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