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

yizhihongxing

《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日

相关文章

  • C#正则过滤HTML标签并保留指定标签的方法

    C# 中可以使用正则表达式轻松过滤 HTML 标签,同时保留指定标签。以下是实现这个功能的完整攻略: 正则匹配 HTML 标签 首先需要建立一个正则表达式,来捕获 HTML 标签。 Regex regex = new Regex("<.*?>", RegexOptions.Compiled | RegexOptions.Mul…

    JavaScript 2023年6月11日
    00
  • 纯JS实现五子棋游戏兼容各浏览器(附源码)

    下面是详细讲解“纯JS实现五子棋游戏兼容各浏览器(附源码)”的完整攻略。 1. 实现概述 该游戏是基于纯JS实现的,实现思路如下: 初始化画布,绘制棋盘; 监听鼠标点击事件,判断点击位置是否合法; 判断当前玩家是否胜利; 实现AI逻辑,即电脑自动下棋的过程。 2. 实现过程 2.1 初始化画布,绘制棋盘 首先,在HTML中定义一个canvas元素用于绘制游戏…

    JavaScript 2023年6月11日
    00
  • 利用AjaxControlToolkit实现百度搜索时的下拉列表提示详细步骤

    使用AjaxControlToolkit实现百度搜索时的下拉列表提示,首先需要安装AjaxControlToolkit和jQuery。 步骤如下: 步骤一:创建一个WebForm 在你的Web应用程序中,创建一个名为“Default.aspx”的WebForm。 步骤二:将AjaxControlToolkit添加到你的项目中 从Nuget包管理器中,选择Aj…

    JavaScript 2023年6月11日
    00
  • JavaScript中的函数申明、函数表达式、箭头函数

    在 JavaScript 中,函数定义有三种方式:函数声明、函数表达式和箭头函数。 函数声明 函数声明是定义一个函数的常见方式,语法如下: function add(x, y) { return x + y; } 其中 add 是函数名,x 和 y 是参数,return 关键字用于返回计算结果。 函数声明有一个重要的特点,就是函数可以在声明之前被调用(也就是…

    JavaScript 2023年5月27日
    00
  • element前端实现压缩图片的功能

    实现前端压缩图片的功能,可以提高网站的加载速度和用户体验,同时减少网络传输的流量和存储的空间。Element提供了el-upload组件,它支持通过设置before-upload钩子函数对上传的图片进行压缩。 以下是实现压缩图片的步骤: 步骤一:封装上传组件 在vue组件中,引入el-upload组件,并设置相关属性和方法。 <el-upload cl…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript 高阶函数

    详解JavaScript 高阶函数 什么是高阶函数? 高阶函数是指接受函数作为参数,或返回一个函数作为返回值的函数。 JavaScript 中函数是一等公民,既可以被当做普通的数据类型进行传递,同时也可以作为返回值,这使得高阶函数成为了 JavaScript 中非常重要的一个概念。 通过高阶函数,我们可以实现非常灵活的代码设计,封装一些通用的操作,让代码变得…

    JavaScript 2023年5月27日
    00
  • JavaScript 函数式编程的原理

    JavaScript函数式编程的原理 什么是函数式编程 函数式编程(Functional Programming,简称FP)是一种编程范式,它把计算机运算视为对数学上函数的运用和组合。不同于命令式范式,函数式编程没有程序状态的概念,只有函数输入、输出的概念,你可以看作是由一组输入及对应的输出组成的数学函数。在函数式编程中,函数是一等公民,函数可以作为参数传递…

    JavaScript 2023年5月27日
    00
  • js中动态创建json,动态为json添加属性、属性值的实例

    让我们来详细讲解一下JS中动态创建JSON、动态为JSON添加属性、属性值的实例。 一、什么是JSON JSON,全称为JavaScript Object Notation,是一种结构化的数据格式。它以文本的形式表示数据,比XML更加轻量级,也更容易解析。JSON由键值对构成,键值对之间用逗号分隔,最外层使用花括号{}。 JSON的键必须是字符串类型,值可以…

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