JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

JS作为一门基于面向对象的语言,其语法中包含了许多与对象有关的特性。本文将介绍JS中Object类、静态属性、闭包、私有属性、call和apply的使用、继承的三种实现方法。

Object类

在JS中,所有对象都是由Object类派生而来,因此也可以说所有对象都是Object的实例。Object类可以定义一些公共的属性和方法,使其他对象可以继承它们。

示例:

// 定义一个Person类
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 通过Object类添加一个方法
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}

// 创建一个实例
const person = new Person('Tom', 18);

// 调用方法
person.sayHello();   // 输出:Hello, my name is Tom, I'm 18 years old.

静态属性

JS中的静态属性定义在类中,而不是实例中。这意味着,无论有多少个实例被创建,静态属性的值都是相同的,并且可以通过类名直接访问。

示例:

// 定义一个Car类
function Car() {}

// 添加一个静态属性
Car.totalNum = 0;

// 添加一个方法
Car.prototype.drive = function() {
  Car.totalNum++;
  console.log(`Driving... Current speed: ${this.speed}`);
}

// 创建两个实例
const car1 = new Car();
const car2 = new Car();

// 调用drive方法
car1.drive();   // Driving... Current speed: undefined
car2.drive();   // Driving... Current speed: undefined

// 访问静态属性
console.log(Car.totalNum);   // 输出:2

闭包

闭包是指有权访问另一个函数作用域中的变量的函数。通常情况下,函数内部的变量在函数调用后就无法访问。但是,在某些情况下,我们希望能够访问函数内部的变量,这时就需要使用到闭包了。

示例:

// 因为ES6的出现,我们甚至可以使用更加简洁的箭头函数定义闭包
const greet = (name) => {
  let greeting = 'Hello';
  const greetWithName = () => {
    console.log(`${greeting}, ${name}`);
  }
  return greetWithName;
}

const sayHelloToTom = greet('Tom');
sayHelloToTom();   // 输出:Hello, Tom

私有属性

JS中并没有像其他语言一样有“私有”属性的关键字,我们可以通过闭包的实现方法来实现类似于私有属性的功能。

示例:

// 定义一个Person类
function Person(name) {
  // 利用闭包实现私有属性
  const _age = 18;
  this.name = name;

  // 私有方法
  function _sayName() {
    console.log(`My name is ${this.name}.`);
  }

  // 公有方法
  this.sayHello = function () {
    _sayName();
    console.log(`I'm ${_age} years old.`);
  }
}

// 创建一个实例
const person = new Person('Tom');

person.sayHello();  // 输出:My name is Tom. I'm 18 years old.

call 和 apply 的使用

call和apply是JS中的两个方法,它们的作用是改变函数的上下文,并立即执行函数。

两者的区别在于传参方式不同:call的参数是一个个传递的,而apply的参数是用数组的形式传递的。

示例:

// 定义一个Person类
function Person(name) {
  this.name = name;
}

// 添加一个方法
Person.prototype.sayHello = function (gender, age) {
  console.log(`Hello, my name is ${this.name}. I'm a ${gender}, and I'm ${age} years old.`);
}

// 创建两个实例
const person1 = new Person('Tom');
const person2 = new Person('Jerry');

// 使用call调用方法
person1.sayHello.call(person2, 'boy', 18);       // 输出:Hello, my name is Jerry. I'm a boy, and I'm 18 years old.

// 使用apply调用方法
person1.sayHello.apply(person2, ['boy', 18]);   // 输出:Hello, my name is Jerry. I'm a boy, and I'm 18 years old.

继承的三种实现方法

在JS中,继承的实现方法有三种:原型链、构造函数、组合继承。

示例:

// (1)原型链继承
// 定义一个Animal类
function Animal() {}
Animal.prototype.sayHello = function() {
  console.log('Hello, I am an animal.');
}

// 定义一个Dog类
function Dog() {}
Dog.prototype = new Animal();

// 创建一个实例
const dog = new Dog();
dog.sayHello();   // 输出:Hello, I am an animal.

// (2)构造函数继承
// 定义一个Person类
function Person(name) {
  this.name = name;
}

// 定义一个Employee类
function Employee(name, id) {
  Person.call(this, name);
  this.id = id;
}

// 创建一个实例
const employee = new Employee('Tom', 1001);
console.log(employee.name, employee.id);   // 输出:Tom 1001

// (3)组合继承
// 定义一个Shape类
function Shape() {
  this.name = 'shape';
}

Shape.prototype.toString = function() {
  console.log(`The shape is ${this.name}`);
}

// 定义一个Circle类
function Circle(radius) {
  Shape.call(this);
  this.radius = radius;
}

Circle.prototype = new Shape();
Circle.prototype.constructor = Circle;

Circle.prototype.area = function() {
  console.log(`The area is ${Math.PI * this.radius * this.radius}`);
}

// 创建一个实例
const circle = new Circle(5);
circle.toString();   // 输出:The shape is shape
circle.area();       // 输出: The area is 78.53981633974483

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 - Python技术站

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

相关文章

  • 通过url查找a元素并点击

    要通过url查找a元素并点击, 我们可以使用Selenium WebDriver来实现。以下是完整攻略的步骤: 1. 安装Selenium WebDriver 在终端中输入以下命令,安装Selenium WebDriver: pip install selenium 2. 导入依赖包 from selenium import webdriver from s…

    JavaScript 2023年6月11日
    00
  • JS实现数组/对象数组删除其中某一项

    如果要在JavaScript中删除数组或对象数组中的某一项,可以按照以下步骤进行。 删除数组中的某一项 1.找到要删除的项的索引 要删除数组中的某一项,首先需要找到该项的索引。可以使用indexOf()方法来查找该项在数组中的索引。例如,以下代码查找数字数组中的项 “3” 的索引: const arr = [1, 2, 3, 4]; const index …

    JavaScript 2023年5月27日
    00
  • JavaScript进阶教程(第一课)第3/3页

    下面我将为您详细讲解“JavaScript进阶教程(第一课)第3/3页”的完整攻略。 1. 确定目标 首先,我们要明确自己的目标是什么,这有助于我们更好地制定学习计划。对于“JavaScript进阶教程(第一课)第3/3页”这个教程来说,我们的目标应该是掌握以下内容: 理解 JavaScript 中的数据类型 掌握 JavaScript 对象的使用方法 学习…

    JavaScript 2023年5月17日
    00
  • IE DOM实现存在的部分问题及解决方法

    IE是Web开发中经典的浏览器之一,它的DOM实现在早期版本中存在一些问题,主要体现在以下两个方面: 1.慢速浏览器崩溃 IE浏览器在处理DOM时,如果DOM结构过于复杂或是操作过于频繁会导致浏览器崩溃的情况。这是由于IE浏览器的DOM实现存在一些性能问题所导致的。 解决方法:优化DOM结构或在操作DOM时避免频繁重排,可以通过以下几种方式来实现优化: 将对…

    JavaScript 2023年6月10日
    00
  • js判断上传文件类型判断FileUpload文件类型代码

    下面是详细讲解“js判断上传文件类型判断FileUpload文件类型代码”的完整攻略。 1. 判断上传文件类型 在前端上传文件时,通常需要对上传的文件类型进行限制,以保证服务器端能正确处理文件。在JavaScript中,可以通过判断FileInput元素的文件类型来实现对上传文件类型的限制。 具体实现步骤如下: 1.1 获取上传文件的类型 使用File AP…

    JavaScript 2023年5月27日
    00
  • 浅析webpack 如何优雅的使用tree-shaking(摇树优化)

    浅析Webpack如何优雅的使用Tree-Shaking(摇树优化) 什么是Tree-Shaking Tree-Shaking(摇树优化)是指Webpack会把所有引入的模块融合为一个文件,然后去除掉其中未被使用的代码,生成的文件只包含实际需要用到的代码块。这种优化技术可以有效地减少打包出来的文件大小,从而提高网页的加载速度。 如何使用Tree-Shakin…

    JavaScript 2023年6月11日
    00
  • JS和jQuery使用submit方法无法提交表单的原因分析及解决办法

    让我详细讲解一下“JS和jQuery使用submit方法无法提交表单的原因分析及解决办法”的完整攻略。 1. 概述 在开发网页时,我们经常会使用JS和jQuery来操作DOM元素和处理表单数据。其中,提交表单是经常用到的操作,但是有时我们会遇到JS和jQuery使用submit方法无法提交表单的情况。这时,我们就需要对其原因进行分析,并采取相应的解决办法。 …

    JavaScript 2023年6月10日
    00
  • javascript获取网页宽高方法汇总

    当我们需要编写一些Web应用或网站时,有时需要获取浏览器的宽度和高度等信息,以便根据宽高信息来做出一些响应式设计或适配不同尺寸设备的设计等。下面介绍一些获取网页宽高的方法。 方法一:获取浏览器窗口宽高 通过 window.innerWidth 和 window.innerHeight 可以获取浏览器窗口实际的宽高,这个方法可用于获取当前设备的可视区域大小。示…

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