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

相关文章

  • Android中实现WebView和JavaScript的互相调用详解

    在Android中,可以通过WebView组件来实现网页的浏览和展示,同时也可以与JavaScript交互来实现更加丰富的功能。在本篇攻略中,将详细讲解如何在Android中实现WebView和JavaScript的互相调用。 步骤一:设置WebView 首先需要在XML布局文件中定义一个WebView组件,在Java代码中找到它并进行一些设置: <W…

    JavaScript 2023年6月11日
    00
  • Javascript之文件操作

    下面是详细讲解JavaScript之文件操作的完整攻略,包括文件的读取、写入、删除等常见操作。 1. 读取文件 1.1 读取本地文件 可以使用FileReader对象读取本地文件。它提供一些方法来读取文件的内容,如readAsArrayBuffer、readAsBinaryString、readAsText、readAsDataURL等。这些方法的参数是一个…

    JavaScript 2023年5月18日
    00
  • JavaScript中的高级函数

    JavaScript中的高级函数是指可以作为参数传递给其他函数或者作为返回值的函数。它们可以帮助我们更优雅地处理数据,并且能够让我们的代码更加简洁易懂。在本文中,我们将深入探讨这些高级函数,并且会通过示例进行讲解。 什么是高级函数 在JavaScript中,函数是一等公民。这意味着函数可以像其他类型的值一样被传递、赋值或者作为函数的返回值。高级函数是一类特殊…

    JavaScript 2023年6月10日
    00
  • js金额千分位的6种实现方法实例

    现在我们就来详细讲解“js金额千分位的6种实现方法实例”的完整攻略。 什么是金额千分位? 在很多场景下,我们需要显示金融金额,而金融金额的显示习惯是每三个数加一个逗号(英文符号为“,”),以便于人类去识别和理解这个数值,这就是所谓金额千分位。 比如,10000.00元要进行金额千分位转换后为:10,000.00元。 6种实现金额千分位的方法 下面我们就来介绍…

    JavaScript 2023年5月28日
    00
  • 使用HTML5中postMessage知识点解决Ajax中POST跨域问题

    HTML5中的postMessage方法可以用来跨窗口通信,可以传递数据并且支持跨域。 在Ajax中,由于同源策略的限制,POST请求无法发送到跨域的服务器。而使用postMessage方法可以解决POST跨域问题,代码示例如下: 在发送请求的页面中,编写postMessage方法 var targetOrigin = ‘http://example.com…

    JavaScript 2023年6月11日
    00
  • JSON.parse处理非标准Json数据出错的解决

    当我们使用JSON.parse()解析JSON格式的数据时,如果数据格式非标准的话,就有可能会出现报错现象。 例如我们有一个非标准的JSON格式数据如下: { name: "Tom", age: 28 } 使用JSON.parse()时会报错,错误信息如下: Uncaught SyntaxError: Unexpected token n…

    JavaScript 2023年5月27日
    00
  • 精通Javascript系列之Javascript基础篇

    下面是“精通Javascript系列之Javascript基础篇”的完整攻略: 1. 确定学习目标 在开始学习之前,我们需要了解自己的学习目标,以便更好地计划学习路线和学习资源。在Javascript基础篇中,我们主要需要掌握以下知识点: Javascript的基本语法和数据类型 变量、运算符、条件分支、循环等控制流程的方法 Javascript中常用的内置…

    JavaScript 2023年5月18日
    00
  • 关于日期正则表达式的思路详解

    《关于日期正则表达式的思路详解》是一篇涉及日期格式的正则表达式文章,旨在帮助读者理解如何通过正则表达式匹配各种常见的日期格式。文章主要分为以下三个部分: 1. 常见日期格式的分析 在这一部分中,我们对常见的日期格式进行了分析,包括ISO 8601日期格式、美国日期格式、欧洲日期格式等等,同时针对每种日期格式提供了相应的正则表达式示例。 例如,我们可以通过以下…

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