javascript 面向对象技术基础教程第2/2页

《JavaScript 面向对象技术基础教程》的第2/2页讲解了 JavaScript 的面向对象编程技术,主要包括对象、继承、多态和封装等概念。它是本书的重头戏,对于理解 JavaScript 面向对象的开发思想非常重要,下面提供一份完整攻略,帮助初学者快速掌握。

对象

在 JavaScript 中,对象是一组属性和方法的集合。创建对象的方式有几种,最常见的是使用对象字面量和构造函数。例如:

// 对象字面量方式创建对象
var person1 = {
  name: "Amy",
  age: 20,
  sayHello: function() {
    console.log("Hello, I'm " + this.name);
  }
};

// 构造函数方式创建对象
function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function() {
    console.log("Hello, I'm " + this.name);
  };
}
var person2 = new Person("Bob", 22);

以上示例分别展示了对象字面量和构造函数创建对象的过程,注释已经把每个部分讲得很清楚了。需要注意的是,使用构造函数创建的多个对象可以共享同一个原型对象,从而实现属性和方法复用。

继承

在 JavaScript 中,继承是使用原型链实现的。原型链是指每个对象都有一个指向另一个对象的内部链接,而这个对象又可以有自己的链接,这样层层链接下去就形成了原型链。用原型链实现继承主要有两种方式:原型继承和构造函数继承。以下是两种方式的示例:

// 原型继承
var person = {
  name: "Amy",
  age: 20,
  sayHello: function() {
    console.log("Hello, I'm " + this.name);
  }
};
var student = Object.create(person); // 继承 person 对象
student.grade = 90;
student.showGrade = function() {
  console.log(this.name + "'s grade is " + this.grade);
};

// 构造函数继承
function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function() {
    console.log("Hello, I'm " + this.name);
  };
}
function Student(name, age, grade) {
  Person.call(this, name, age); // 借用 Person 构造函数
  this.grade = grade;
  this.showGrade = function() {
    console.log(this.name + "'s grade is " + this.grade);
  };
}
Student.prototype = Object.create(Person.prototype); // 继承 Person 原型对象

以上示例分别展示了原型继承和构造函数继承的过程。需要注意的是,在使用构造函数继承时,需要借用超类的构造函数,同时修改子类的原型指向超类的原型对象。这样,子类的实例就可以共享超类的方法。

多态

多态是一种让不同对象之间表现出相同的行为特征的能力。在 JavaScript 中,实现多态主要是通过限制调用方式和参数类型来实现。以下是一个示例:

function getArea(shape) {
  if (shape instanceof Rectangle) {
    return shape.width * shape.height;
  } else if (shape instanceof Circle) {
    return Math.pow(shape.radius, 2) * Math.PI;
  }
}
function Rectangle(width, height) {
  this.width = width;
  this.height = height;
}
function Circle(radius) {
  this.radius = radius;
}

以上示例中,通过 instanceof 运算符来判断参数的类型,从而实现针对不同对象的处理方式。需要注意的是,这种方式需要开发者自己判断对象类型,比较繁琐。ES6 提供了更方便的实现方式。

封装

封装是指将一个对象的属性和方法包装起来,防止外界直接访问。在 JavaScript 中,封装通常是通过闭包实现的。以下是一个示例:

function createPerson(name, age) {
  var _name = name; // 私有数据,仅在函数内部可访问
  var _age = age;

  var obj = {
    getName: function() {
      return _name;
    },
    setName: function(name) {
      _name = name;
    },
    getAge: function() {
      return _age;
    },
    setAge: function(age) {
      _age = age;
    }
  };

  return obj;
}

var person = createPerson("Amy", 20);
person.getName(); // "Amy"
person.setName("Bob");
person.getName(); // "Bob"

以上示例中,变量 _name 和 _age 被封装在 createPerson 函数内部,通过闭包的方式访问。外界无法直接访问,只能通过 obj 对象访问。

示例说明

  1. 封装

下面是一个使用 Object.freeze() 方法封装对象的示例:

var person = {
  name: "Amy",
  age: 20
};
Object.freeze(person); // 冻结对象,属性和方法不可修改或删除

function tryToChange(obj) {
  obj.age = 22; // 年龄不可修改
}
tryToChange(person);
console.log(person.age); // 20

以上示例中,使用 Object.freeze() 方法冻结 person 对象,使其属性和方法不可修改或删除。在 tryToChange() 函数中尝试修改年龄属性,但是失败了,因为该属性被冻结了。

  1. 多态

下面是一个使用 class 关键字实现多态的示例:

class Shape {
  getName() {
    return "Shape";
  }
}

class Circle extends Shape {
  getName() {
    return "Circle";
  }
}

class Rectangle extends Shape {
  getName() {
    return "Rectangle";
  }
}

function printShapeName(shape) {
  console.log(shape.getName());
}

const circle = new Circle();
const rectangle = new Rectangle();
printShapeName(circle); // "Circle"
printShapeName(rectangle); // "Rectangle"

以上示例中,使用 ES6 的 class 关键字定义了 Shape、Circle 和 Rectangle 三个类,并重写了它们的 getName() 方法,实现了多态。使用 printShapeName() 函数,实现了对不同对象的统一调用方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript 面向对象技术基础教程第2/2页 - Python技术站

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

相关文章

  • JavaScript find()方法及返回数据实例

    下面是关于JavaScript中find()方法及返回数据的完整攻略,包括方法的介绍、语法、参数、返回值和示例说明。 find()方法介绍 JavaScript中的find()方法是ES6中新增加的数组方法之一,用于返回符合条件的第一个数组元素,如果没有符合条件的元素则返回undefined。 find()方法的语法 array.find(function(…

    JavaScript 2023年5月28日
    00
  • Javascript Date toDateString() 方法

    以下是关于JavaScript Date对象的toDateString()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的toDateString()方法 JavaScript的toDateString()方法返回一个表示对象日期部分的字符串,该字符串格式为英文的星期几、英文的月份、日期和年份。 下面是使用对象的toDateStrin…

    JavaScript 2023年5月11日
    00
  • js实现轮播图的完整代码

    下面是JavaScript实现轮播图的完整攻略,包含两条示例说明: 一、代码实现步骤 选中需要轮播的元素和轮播的图片,通过DOM操作获取其元素节点。 js let slider = document.querySelector(“.slider”); let img = document.querySelectorAll(“.slider img”); 设置…

    JavaScript 2023年6月11日
    00
  • JavaScript创建对象的七种方式全面总结

    JavaScript创建对象的七种方式全面总结 在JavaScript中,有多种方式可以创建对象,本篇文章将介绍七种常用的创建对象的方式,并通过示例代码对其进行详细的讲解。 1. 对象字面量 最常用的创建对象的方式就是使用对象字面量,即在花括号内定义属性和值。 示例代码: var person = { name: "John", age:…

    JavaScript 2023年5月27日
    00
  • JavaScript中的简写语法分享

    当我们在写JavaScript代码的时候,经常会用到一些简写语法来简化代码、提高开发效率。在本篇文章中,我们将会分享一些JavaScript中的简写语法,帮助大家学会如何更加高效地编写JavaScript代码。 一、三元运算符简写 三元运算符通常用于处理条件分支,可以把一个简单if-else语句变得更加简洁。在三元运算符的基础上,我们还可以使用它的简写形式。…

    JavaScript 2023年6月10日
    00
  • 浅谈JS数组内置遍历方法有哪些和区别

    让我来详细讲解一下“浅谈JS数组内置遍历方法有哪些和区别”这个话题。 一、JS数组内置遍历方法 JS数组内置了很多遍历方法,其中常用的有以下五种: 1. forEach() forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。forEach() 不会返回任何值。 示例: const arr = [‘apple’, ‘orange’, ‘b…

    JavaScript 2023年5月27日
    00
  • JS两种类型的表单提交方法实例分析

    下面是关于“JS两种类型的表单提交方法实例分析”的完整攻略: JS两种类型的表单提交方法实例分析 提交表单的两种方式 在JS中,可以使用两种不同的方式来提交表单:普通表单提交和Ajax表单提交。 普通表单提交 普通表单是指通过浏览器的提交按钮或通过JS代码完成表单的提交。当我们使用表单提交时,表单会重新加载页面并传递表单数据到服务器。普通表单提交方法很简单,…

    JavaScript 2023年6月10日
    00
  • JavaScript 数组基本操作全解

    JavaScript 数组基本操作全解 什么是 JavaScript 数组? JavaScript 数组是存储值的有序集合。它可以存储任何类型的值,例如数字、字符串和对象。 数组的每个元素都有一个数字索引,用于访问数组中的元素。 如何创建 JavaScript 数组? 可以使用以下两种方式创建 JavaScript 数组: 1.直接赋值 let fruits…

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