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日

相关文章

  • 高性能js数组去重(12种方法,史上最全)

    这里为大家详细讲解“高性能js数组去重(12种方法,史上最全)”的完整攻略。 1. 原始数组去重方法 原始数组去重方法是指使用两层循环遍历原始数组,逐个将元素与新数组中的元素作比较,如果新数组中没有相同的元素,就把该元素压入新数组。这种方法代码简单易懂,适合只有少量元素的数组去重。 代码如下: function unique1(arr) { var newA…

    JavaScript 2023年5月27日
    00
  • JS常用正则表达式及验证时间的正则表达式

    JS常用正则表达式及验证时间的正则表达式 一、常用正则表达式 1. 邮箱验证正则表达式 /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/ 该正则表达式验证邮箱是否合法,以多段分别用@和.连接。 [a-zA-Z0-9_-]+表示特殊字符_-、数字、大小写字母可以重复出现一次或多次。 (\.[a-zA-Z0…

    JavaScript 2023年6月10日
    00
  • js打开windows上的可执行文件示例

    下面提供一份详细的js打开windows上的可执行文件的攻略。 1. 安装Node.js Node.js是一种运行在服务器端的JavaScript运行环境,可以让JavaScript运行在服务器端,调用操作系统的API以及其它的系统级功能。因此,在打开windows上的可执行文件前,需要安装Node.js。 在Node官网(https://nodejs.or…

    JavaScript 2023年5月27日
    00
  • javascript数组的内置方法详解

    当然,我非常乐意为您提供关于 “JavaScript 数组的内置方法详解”的完整攻略。 概述 在 JavaScript 中,数组(Array)是一种非常常见的数据类型,具有优秀的灵活性和可扩展性。为了让开发者更加方便的使用和操作数组,JavaScript 内置了众多的数组方法。 在这份攻略中,我将会详细介绍 JavaScript 数组的内置方法,包括数组的创…

    JavaScript 2023年5月27日
    00
  • Ajax 传递JSON实例代码

    下面是针对“Ajax传递JSON实例代码”的完整攻略。 1. 什么是Ajax传递JSON Ajax传递JSON指的是在使用Ajax技术进行数据传递时,传递的数据格式是JSON。Ajax技术在Web开发中被广泛应用,通过异步请求实现前端和后端的数据交互,可以实现无刷新页面的交互效果。 在传递JSON数据时,通常使用Ajax的POST方法将数据传输给后端,后端再…

    JavaScript 2023年6月11日
    00
  • ExtJs的Date格式字符代码

    以下是“ExtJs的Date格式字符代码”的完整攻略。 一、什么是Date格式字符代码? 在ExtJs中,Date类是与日期和时间相关的一个重要类。在将日期或时间数据格式化为字符串时,需要使用Date格式字符代码。Date格式字符代码是指日期/时间格式字符串中的特殊字符代码,用于表示日期或时间的各个部分。常见的Date格式字符代码包括年份、月份、日期、星期、…

    JavaScript 2023年6月10日
    00
  • JS正则表达式验证账号、手机号、电话和邮箱是否合法

    下面我将介绍使用JavaScript正则表达式来验证账号、手机号、电话和邮箱是否合法的方法。 验证账号 账号的验证规则是由字母、数字、下划线组成的,长度为4-16位。我们可以使用正则表达式来进行验证。具体代码如下: function validateUsername(username) { var pattern = /^[a-zA-Z0-9_]{4,16}…

    JavaScript 2023年6月10日
    00
  • vue父子组件进行通信方式原来是这样的

    我会详细讲解Vue父子组件进行通信的方式,包括三种方式:props、事件、$refs。 Props props 是父组件向子组件传递数据的一种方式。父组件可以通过定义子组件的 props,来向子组件传递数据。子组件可以通过 this.$props 来访问 props 中的值。下面是一个示例: 父组件: <template> <div>…

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