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

yizhihongxing

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日

相关文章

  • JavaScript 页面编码与浏览器类型判断代码

    让我来详细讲解一下”JavaScript页面编码与浏览器类型判断代码”的完整攻略。 页面编码 在网页开发中,为了确保浏览器能正确地解读和显示我们写出的HTML和CSS代码,我们需要在网页中指定一种字符编码方式。常见的字符编码方式包括UTF-8, GB2312, GBK等。 我们可以通过在网页中加入如下的meta标签来指定网页使用的编码方式。 <meta…

    JavaScript 2023年5月20日
    00
  • js入门之Function函数的使用方法【新手必看】

    JS入门之Function函数的使用方法 什么是Function函数 在JavaScript中,函数是一种可重复使用的代码块,用于执行特定的任务。Function函数是最常用的一种函数类型,是一种可执行的JavaScript代码块,可以接受输入并返回输出。它通常被用于将代码结构化,使之易于阅读和维护。 Function函数的语法 function funct…

    JavaScript 2023年5月27日
    00
  • js实现调用网络摄像头及常见错误处理

    JS 实现调用网络摄像头及常见错误处理 调用摄像头 在网页中调用网络摄像头是一个常见的需求,在 web 中,我们可以使用 HTML5 中的 getUserMedia() 方法来获取摄像头的视频流,再利用 Canvas 技术实现对摄像头视频的处理。使用 getUserMedia() 方法时,需要用户授权方可使用摄像头。 // 判断浏览器是否支持 if (nav…

    JavaScript 2023年6月11日
    00
  • js获取元素到文档区域document的(横向、纵向)坐标的两种方法

    JS获取元素到文档区域document的坐标是一个常见的需求,这个过程可以有两种常见的方法来实现。 方法一:使用offsetLeft、offsetTop逐层累加 offsetLeft和offsetTop属性分别可以获取元素左、上边框到其容器元素上边框的距离。如果我们需要获取元素到文档区域document的水平和竖直方向的距离,则需要逐层遍历每个容器元素,将其…

    JavaScript 2023年6月10日
    00
  • JS去掉字符串中所有的逗号

    要去掉一个JavaScript字符串中的所有逗号,可以使用replace()方法。以下是详细步骤: 步骤1:使用正则表达式查找所有的逗号,并替换为一个空字符串。在replace方法中,正则表达式为/,/g,其中第一个斜杆表示开始正则表达式,中间的逗号表示要替换的字符,第二个斜杆表示正则表达式的结束,而字母”g”表示全局标志,指示替换所有匹配的字符串。 步骤2…

    JavaScript 2023年5月28日
    00
  • js与jquery回车提交的方法

    下面详细讲解js与jQuery回车提交的方法的完整攻略。 什么是回车提交 回车提交是指用户在输入框内输入内容后按下键盘上的回车键,就会自动提交表单或执行相应的操作,而不需要再点击提交按钮。在表单或查询页面中,这是一种很方便的操作方式。 JavaScript回车提交 Javascript可以通过监听页面上的键盘操作,并且每次键盘按下事件被触发时执行代码。利用这…

    JavaScript 2023年6月11日
    00
  • js利用cookie实现记住用户页面操作

    下面是针对“js利用cookie实现记住用户页面操作”的完整攻略: 1. 概述 在用户访问网站时,很多时候需要记录一些用户的状态信息,如登录状态、上一次访问的页面等等。这时候,使用Cookie是一种非常方便的方式。Cookie是由服务器发送给浏览器的一小段数据,存储在客户端本地的某个位置,如硬盘、内存等,可以在每次HTTP请求时自动发送到服务器端。JavaS…

    JavaScript 2023年6月11日
    00
  • javascript 在firebug调试时用console.log的方法

    下面是详细讲解 JavaScript 在 Firebug 调试时用 console.log 的方法的攻略: 1.安装 Firebug 要使用 Firebug 进行 JavaScript 调试,首先需要安装 Firebug 插件,可以在 Firefox 插件商店中搜索并安装即可。 2.启用 Firebug 安装完成后,在 Firefox 中按下 F12 键或者…

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