当前位置: 首页 > news >正文

js 常用扩展方法总结+应用

文章目录

    • js 常用扩展方法总结
    • 扩展方法应用选择
    • 大型项目 中扩展方法应用选择
    • 小型项目中 扩展应用

js 常用扩展方法总结

  1. 函数原型(prototype)扩展方法
    • 介绍:在JavaScript中,通过修改函数的prototype属性可以为该函数创建的所有对象添加共享的方法。这是一种基于原型链的扩展方式,所有通过该构造函数创建的对象都可以访问这些扩展的方法。
    • 示例
function Person(name) {this.name = name;
}
// 为Person的所有实例扩展一个方法
Person.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}`);
};
const person1 = new Person("Alice");
person1.sayHello(); 
  1. 对象字面量扩展方法(直接在对象上添加方法)
    • 介绍:对于单个对象,可以直接在对象字面量定义中添加方法。这种方法简单直接,适用于创建一次性的、具有特定行为的对象。
    • 示例
const myObject = {property: "value",myMethod: function() {console.log("This is my method");}
};
myObject.myMethod(); 
  1. Object.assign()方法扩展(合并对象并添加方法)
    • 介绍Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。可以利用它来扩展一个对象,添加新的方法或覆盖现有属性。
    • 示例
const baseObject = {existingProperty: "existing value"
};
const newMethods = {newMethod: function() {console.log("This is a new method");}
};
const extendedObject = Object.assign({}, baseObject, newMethods);
extendedObject.newMethod(); 
  1. class语法扩展方法(在类中添加方法)
    • 介绍:在ES6的class语法中,可以在类定义内部通过添加方法来扩展类的功能。类的方法会被所有类的实例共享,这种方式更符合面向对象编程的结构。
    • 示例
class Shape {constructor(name) {this.name = name;}area() {console.log("The area method needs to be implemented in sub - classes");}
}
class Circle extends Shape {constructor(radius) {super("Circle");this.radius = radius;}area() {return Math.PI * this.radius * this.radius;}
}
const myCircle = new Circle(5);
console.log(myCircle.area()); 
  1. 使用Function.prototype.bind()间接扩展方法(改变函数的this指向来扩展功能)
    • 介绍bind()方法会创建一个新函数,当这个新函数被调用时,它的this值会被绑定到指定的对象上。这可以用于在特定的上下文环境中扩展函数的行为。例如,将一个通用的函数绑定到特定的对象上,使其能够访问该对象的属性。
    • 示例
const obj = {value: 42
};
function showValue() {console.log(this.value);
}
const boundShowValue = showValue.bind(obj);
boundShowValue(); 
  1. 使用装饰器模式(在函数外层包装新功能)扩展方法
    • 介绍:装饰器模式是一种结构型设计模式,在JavaScript中可以用来在不修改原函数的基础上,动态地给函数添加新的功能。它通过创建一个包装函数,在包装函数内部调用原函数,并在调用前后添加额外的逻辑。
    • 示例
function withLogging(func) {return function() {console.log("Function is about to be called");const result = func.apply(this, arguments);console.log("Function has been called");return result;};
}
function addNumbers(a, b) {return a + b;
}
const loggedAddNumbers = withLogging(addNumbers);
console.log(loggedAddNumbers(3, 5)); 
  1. 使用Proxy对象扩展方法(拦截操作并添加自定义行为)
    • 介绍Proxy对象用于定义基本操作的自定义行为(如属性查找、赋值、枚举、函数调用等)。可以利用它来拦截对对象方法的调用,并在调用前后添加扩展的逻辑,例如记录方法调用次数、添加权限验证等。
    • 示例
const target = {myMethod: function() {console.log("Original method called");}
};
const handler = {apply: function(target, thisArg, argumentsList) {console.log("Before method call");const result = target.myMethod.apply(thisArg, argumentsList);console.log("After method call");return result;}
};
const proxiedObject = new Proxy(target, handler);
proxiedObject.myMethod(); 

扩展方法应用选择

  1. 考虑代码的组织和维护性
    • 基于原型(prototype)扩展
      • 适用场景:当你在构建面向对象的JavaScript代码,并且希望在多个对象实例之间共享方法时,使用prototype扩展是很好的选择。例如,在创建自定义对象类型(如PersonCar等)时,通过prototype为所有实例添加通用的方法(如Person.prototype.sayHello)可以减少内存占用,因为方法在原型链上共享,而不是每个实例都有一份独立的方法副本。
      • 示例
function Vehicle(type) {this.type = type;
}
Vehicle.prototype.start = function() {console.log(`The ${this.type} is starting.`);
};
const car = new Vehicle("car");
const truck = new Vehicle("truck");
car.start();
truck.start();
  • 对象字面量扩展
    • 适用场景:对于简单的、一次性的对象,对象字面量扩展很方便。如果只是需要为一个特定的、独立的对象添加一些方法,这种方式可以让代码在局部范围内清晰地定义对象及其行为。
    • 示例
const userSettings = {fontSize: 14,color: "black",updateFontSize: function(newSize) {this.fontSize = newSize;console.log(`Font size updated to ${this.fontSize}`);}
};
userSettings.updateFontSize(16);
  • class语法扩展
    • 适用场景:在使用现代JavaScript开发大型应用程序,遵循面向对象编程原则时,class语法提供了一种更结构化、更易读的方式来定义对象和扩展方法。它使得代码组织类似于传统的面向对象语言,便于团队协作和代码维护。特别是在处理继承关系(如extends关键字)时,class语法更加清晰。
    • 示例
class Animal {constructor(name) {this.name = name;}makeSound() {console.log("Generic animal sound");}
}
class Dog extends Animal {constructor(name) {super(name);}makeSound() {console.log("Woof!");}
}
const myDog = new Dog("Buddy");
myDog.makeSound();
  1. 考虑功能需求和灵活性
    • Object.assign()扩展
      • 适用场景:当需要合并多个对象的属性和方法,或者从一个对象中复制属性和方法到另一个对象时,Object.assign()很有用。这种方式在配置对象、创建具有默认值和自定义值组合的对象等场景下表现出色。
      • 示例
const defaultSettings = {theme: "light",fontSize: 16
};
const userPreferences = {fontSize: 18
};
const finalSettings = Object.assign({}, defaultSettings, userPreferences);
console.log(finalSettings);
  • Function.prototype.bind()间接扩展
    • 适用场景:如果需要改变函数内部this的指向,将函数绑定到特定的对象上下文,bind()方法是合适的选择。在事件处理、回调函数等场景中,经常需要确保函数在正确的this上下文中执行。
    • 示例
const button = document.createElement("button");
button.textContent = "Click me";
const obj = {message: "Button clicked"
};
button.addEventListener("click", function() {console.log(this.message);
}.bind(obj));
document.body.appendChild(button);
  • 装饰器模式扩展
    • 适用场景:当你想要在不修改原有函数代码的基础上,为函数添加额外的功能,如日志记录、性能监控、权限验证等,装饰器模式是很好的选择。它提供了一种灵活的方式来动态地增强函数的功能。
    • 示例
function logExecutionTime(func) {return function() {const startTime = Date.now();const result = func.apply(this, arguments);const endTime = Date.now();console.log(`Function ${func.name} took ${endTime - startTime}ms to execute`);return result;};
}
function add(a, b) {return a + b;
}
const loggedAdd = logExecutionTime(add);
console.log(loggedAdd(3, 5));
  • Proxy对象扩展
    • 适用场景:如果需要对对象的操作(如方法调用、属性访问等)进行拦截,并添加自定义的逻辑,如数据验证、访问控制等,Proxy对象是合适的选择。它提供了一种强大的机制来扩展对象的行为,并且可以在运行时动态地改变对象的行为。
    • 示例
const user = {name: "John",age: 30
};
const userProxy = new Proxy(user, {get(target, property) {console.log(`Accessing property ${property}`);return target[property];},set(target, property, value) {console.log(`Setting property ${property} to ${value}`);target[property] = value;return true;}
});
console.log(userProxy.name);
userProxy.age = 31;

大型项目 中扩展方法应用选择

  1. 遵循面向对象设计原则(使用classprototype
    • class语法
      • 适用场景:在大型项目中,如果要构建复杂的对象层次结构,class语法是首选。例如,在一个大型的Web应用程序的用户界面组件库中,每个组件可以定义为一个类。像React组件(虽然它有自己的基于类的旧语法和函数式组件语法)或Vue组件的类定义,通过class可以清晰地定义组件的属性、方法和生命周期钩子等。
      • 示例:假设我们在构建一个简单的UI组件库,有一个基础的Button类。
class Button {constructor(text) {this.text = text;this.enabled = true;}click() {if (this.enabled) {console.log(`Button "${this.text}" clicked.`);} else {console.log(`Button "${this.text}" is disabled.`);}}disable() {this.enabled = false;}
}
const myButton = new Button("Submit");
myButton.click();
myButton.disable();
myButton.click();
  • prototype扩展(与class结合使用)
    • 适用场景:对于一些通用的、不依赖于特定类实例状态的方法,可以通过prototype来扩展。例如,在处理数据模型类时,可能有一些工具方法用于数据验证或格式化,这些方法可以放在原型上。假设我们有一个User数据模型类,通过prototype为其添加一个验证电子邮件格式的方法。
    • 示例
function User(name, email) {this.name = name;this.email = email;
}
User.prototype.validateEmail = function() {const emailRegex = /^[a-zA - Z0 - 9_.+-]+@[a-zA - Z0 - 9 -]+\.[a-zA - Z0 - 9-.]+$/;return emailRegex.test(this.email);
};
const user1 = new User("Alice", "alice@example.com");
const user2 = new User("Bob", "invalid_email");
console.log(user1.validateEmail());
console.log(user2.validateEmail());
  1. 配置和对象合并(使用Object.assign()
    • 适用场景:在大型项目中,配置管理是很重要的部分。Object.assign()可用于合并默认配置和用户自定义配置。例如,在一个项目的主题系统中,有默认的主题配置(颜色、字体等),可以使用Object.assign()将用户选择的主题配置合并进去。
    • 示例
const defaultTheme = {primaryColor: "blue",secondaryColor: "gray",fontSize: "16px"
};
const userTheme = {secondaryColor: "green",fontWeight: "bold"
};
const finalTheme = Object.assign({}, defaultTheme, userTheme);
console.log(finalTheme);
  1. 函数增强和中间件模式(装饰器模式和Function.prototype.bind()
    • 装饰器模式
      • 适用场景:在大型项目的请求处理、日志记录或权限控制等场景中,装饰器模式可以有效地增强函数功能。例如,在一个后端API服务中,对于每个API端点的处理函数,可以使用装饰器来添加日志记录和权限验证功能。
      • 示例:假设我们有一个简单的函数用于获取用户数据,使用装饰器来添加日志记录。
function logFunctionCall(func) {return function() {console.log(`Calling function ${func.name}`);return func.apply(this, arguments);};
}
function getUserData(userId) {console.log(`Fetching data for user ${userId}`);// 这里可以是实际的获取数据逻辑,如从数据库获取return {id: userId, name: "John Doe"};
}
const loggedGetUserData = logFunctionCall(getUserData);
loggedGetUserData(123);
  • Function.prototype.bind()
    • 适用场景:在处理事件绑定或异步操作的回调函数时,bind()方法可以确保函数在正确的上下文中执行。例如,在一个大型的JavaScript应用程序中,当处理用户界面交互事件,如按钮点击事件,需要将事件处理函数绑定到正确的组件实例上。
    • 示例
class Counter {constructor() {this.count = 0;this.incrementButton = document.createElement("button");this.incrementButton.textContent = "Increment";this.incrementButton.addEventListener("click", this.increment.bind(this));document.body.appendChild(this.incrementButton);}increment() {this.count++;console.log(`Count: ${this.count}`);}
}
new Counter();
  1. 代理和拦截(使用Proxy
    • 适用场景:在大型项目的数据访问层或对象交互层,如果需要对对象的操作进行细粒度的控制和拦截,Proxy是很好的选择。例如,在一个数据缓存系统中,可以使用Proxy来拦截对数据对象的访问,实现自动缓存和读取缓存的功能。
    • 示例
const cache = new Map();
function createCachedObject(target) {return new Proxy(target, {get(target, property) {if (!cache.has(property)) {cache.set(property, target[property]);}return cache.get(property);}});
}
const dataObject = {value1: 10,value2: 20
};
const cachedDataObject = createCachedObject(dataObject);
console.log(cachedDataObject.value1);
console.log(cachedDataObject.value1);

小型项目中 扩展应用

  1. 对象字面量扩展方法
    • 适用场景
      • 当项目规模较小,逻辑相对简单,且主要是处理一些独立的、一次性的对象时,对象字面量扩展方法是很方便的选择。例如,在一个简单的网页表单验证脚本中,你可能只需要为一个包含表单字段信息的对象添加验证方法。
    • 示例
// 一个简单的表单数据对象
const formData = {username: "",password: "",// 验证用户名是否为空的方法validateUsername: function() {return this.username.length > 0;},// 验证密码长度是否大于等于6的方法validatePassword: function() {return this.password.length >= 6;}
};
// 使用验证方法
console.log(formData.validateUsername());
console.log(formData.validatePassword());
  1. Function.prototype.bind()方法
    • 适用场景
      • 在小型项目的事件处理场景中,尤其是当你需要确保函数内部的this指向正确的对象时,bind()方法非常实用。例如,在一个小型的图片轮播插件中,你可能有一个用于切换图片的函数,需要将其绑定到轮播组件对象上,以正确地访问和更新组件的状态。
    • 示例
const carousel = {currentIndex: 0,images: ["image1.jpg", "image2.jpg", "image3.jpg"],nextImage: function() {this.currentIndex++;if (this.currentIndex >= this.images.length) {this.currentIndex = 0;}console.log(`Showing ${this.images[this.currentIndex]}`);}
};
const nextButton = document.createElement("button");
nextButton.textContent = "Next";
// 将nextImage方法绑定到carousel对象上
nextButton.addEventListener("click", carousel.nextImage.bind(carousel));
document.body.appendChild(nextButton);
  1. 简单的原型(prototype)扩展(对于基于函数构造器的情况)
    • 适用场景
      • 如果小型项目中使用了基于函数构造器创建的对象,并且有一些通用的方法需要被这些对象共享,原型扩展是一个不错的方式。比如,在一个简单的游戏项目中,有多种游戏角色都需要有一个移动的方法,可以通过原型来添加这个共享的方法。
    • 示例
function Character(name, x, y) {this.name = name;this.x = x;this.y = y;
}
// 为Character的所有实例添加移动方法
Character.prototype.move = function(dx, dy) {this.x += dx;this.y += dy;console.log(`${this.name} moved to (${this.x}, ${this.y})`);
};
const player = new Character("Player", 0, 0);
const enemy = new Character("Enemy", 5, 5);
player.move(1, 1);
enemy.move(-1, -1);

相关文章:

js 常用扩展方法总结+应用

文章目录 js 常用扩展方法总结扩展方法应用选择大型项目 中扩展方法应用选择小型项目中 扩展应用 js 常用扩展方法总结 函数原型(prototype)扩展方法 介绍:在JavaScript中,通过修改函数的prototype属性可以为该函数创建的所有对象…...

数据结构---图(Graph)

图(Graph)是一种非常灵活且强大的数据结构,用于表示实体之间的复杂关系。在图结构中,数据由一组节点(或称为顶点)和连接这些节点的边组成。图可以用于表示社交网络、交通网络、网络路由等场景。 1. 基本概…...

前端解析超图的iserver xml

前端解析超图的iserver xml const res await axios.get(url)const xmlDom new DOMParser().parseFromString(res.data, text/xml);// 获取versionconst version xmlDom.getElementsByTagNameNS(*, ServiceTypeVersion)[0].textContent// 获取layerconst layerDom xmlDom.ge…...

LocalForage 使用指南:统一管理 LocalStorage、WebSQL 和 IndexedDB

前言 在前端开发中,客户端数据存储是一个至关重要的环节。无论是用户偏好设置、缓存内容,还是表单数据,都需要一个高效、可靠的存储方案。浏览器原生提供的 LocalStorage、SessionStorage 和 IndexedDB 等 API 虽然功能强大,但使…...

代码随想录算法训练营第五天-哈希-242.有效的字母异位词

这道题的总体感觉不是很难&#xff0c;但是其完成的思想还是很有趣的利用数据下标来代表字母序列然后遍历两个字符串每个字符&#xff0c;给对应字母下标的数组中一个自增&#xff0c;另一个自减通过查看最后的数组内容是不是0&#xff0c;来判断是不是异位词 #include <io…...

学习maven(maven 项目模块化,继承,聚合)

前言 本篇博客的核心&#xff1a;理解maven 项目模块化&#xff0c;继承&#xff0c;聚合 的含义 maven 项目模块化 含义 maven项目模块化&#xff1a;使用maven 构建项目&#xff0c;管理项目的方式&#xff0c;我们可以将maven项目根据内在的关系拆分成很多个小项目【模块】…...

KDD 2025预讲会:10位一作的论文分享与话题思辨|12月18日全天直播

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 圆桌思辨&#xff1a;一作们的KDD 2025投稿经验分享与热点探讨 1. KDD 2025 与往年相比有哪些新变化&#xff1f;两次投稿周期的新规则有哪些影响&#xff1f; 2. 第一篇KDD的工作是如何成功被接收的&#xff1…...

掌握特征提取:机器学习中的 PCA、t-SNE 和 LDA模型

文章目录 一、说明二、既然有 PCA 技术降维&#xff0c;为什么还要学习 t-SNE&#xff1f;2.1 t-SNE的核心思想&#xff1a;2.2 保持点之间的局部关系有什么意义&#xff1f;2.3 t-SNE 的几何直觉&#xff1a; 三、t-SNE 的数学公式&#xff1a;四、目标函数&#xff1a;五、梯…...

JAVA基础:注释

JAVA基础:注释 作用 使得代码中的一段文本不被执行,起到解释说明的作用。 分类 JAVA中的注释有三种: 单行注释 //单行注释多行注释 /* 多 行 注 释 */文档注释 /***@deprecated comments* @author lhy*/文档注释可以添加一些参数作为说明。 有趣的代码注释 卡车/* * *…...

从源码构建安装Landoop kafka-connect-ui

背景 部署Landoop kafka-connect-ui最简单的办法还是通过docker来部署&#xff0c;我们之前的kafka-connect-ui就是通过docker部署的&#xff0c;但是&#xff0c;最近发现个问题&#xff1a;当使用docker部署且防火墙使用的是firewalld的情况下&#xff0c;就会出现端口冲突。…...

【自动驾驶】Ubuntu22.04源码安装Autoware Core/Universe

【自动驾驶】Ubuntu22.04源码安装Autoware Core/Universe 官方源码安装教程前置条件安装ROS2 Humble安装Autoware Core/Universe配置开发环境配置工作空间设置控制台 官方源码安装教程 链接&#xff1a;https://autowarefoundation.github.io/autoware-documentation/main/ins…...

使用Nexus3搭建npm私有仓库

一、npm介绍 npm的全称是Node Package Manager&#xff0c;它是一个开放源代码的命令行工具&#xff0c;用于安装、更新和管理Node.js模块。npm是Node.js的官方模块管理器&#xff0c;它允许用户从一个集中的仓库中下载和安装公共的Node.js模块&#xff0c;并将这些模块集成到…...

OpenHarmony和OpenVela的技术创新以及两者对比

两款有名的国内开源操作系统&#xff0c;OpenHarmony&#xff0c;OpenVela都非常的优秀。本文对二者的创新进行一个简要的介绍和对比。 一、OpenHarmony OpenHarmony具有诸多有特点的技术突破和重要贡献&#xff0c;以下是一些主要方面&#xff1a; 架构设计创新 分层架构…...

【LeetCode每日一题】Leetcode 1071.字符串的最大公因子

Leetcode 1071.字符串的最大公因子 题目描述&#xff1a; 对于字符串 s 和 t&#xff0c;只有在 s t t t … t t&#xff08;t 自身连接 1 次或多次&#xff09;时&#xff0c;我们才认定 t 能除尽 s。 给定两个字符串 str1 和 str2 。返回 最长字符串 x&#xff0c;要…...

《C++:计算机视觉图像识别与目标检测算法优化的利器》

在当今科技飞速发展的时代&#xff0c;计算机视觉领域正经历着前所未有的变革与突破。图像识别和目标检测作为其中的核心技术&#xff0c;广泛应用于安防监控、自动驾驶、智能医疗等众多领域&#xff0c;其重要性不言而喻。而 C语言&#xff0c;凭借其卓越的性能、高效的资源控…...

大模型的构建与部署(2)——数据清洗

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据清洗的必要性与影响 1.1 数据清洗对模型性能的影响 数据清洗是数据预处理的关键步骤,对于模型训练的性能和准确性有着直接的影响。原始数据中的缺失值、重复值、异常值以及数据格式不一致…...

试题转excel;word转excel;大风车excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…...

微信小程序webview和小程序通讯

1.背景介绍 1.1需要在小程序嵌入vr页面&#xff0c;同时在vr页面添加操作按钮与小程序进行通信交互 1.2开发工具&#xff1a;uniapp开发小程序 1.3原型图 功能&#xff1a;.点击体验官带看跳转小程序的体验官带看页面 功能&#xff1a;点击立即咨询唤起小程序弹窗打电话 2.…...

ChatGPT大模型 创作高质量文案的使用教程和案例

引言 随着人工智能技术的飞速发展,大语言模型如 ChatGPT 在创作文案、生成内容方面展现出了强大的能力。无论是个人用户还是企业用户,都可以利用 ChatGPT 提高工作效率、激发创意、甚至解决实际问题。本文将详细介绍 ChatGPT 如何帮助创作各类高质量文案,并通过具体案例展示…...

Vue Web开发(八)

1. VueWeb面包屑和tag的布局 本章节完成VueWeb面包屑和tag的布局&#xff0c;并且与左侧菜单联系&#xff0c;涉及组件间通信。 1.1. 页面创建 &#xff08;1&#xff09;首先我们先完成每个页面的路由&#xff0c;之前已经有home页面和user页面&#xff0c;缺少mail页面和其…...

element-ui实现table表格的嵌套(table表格嵌套)功能实现

最近在做电商类型的官网&#xff0c;希望实现的布局如下&#xff1a;有表头和表身&#xff0c;所以我首先想到的就是table表格组件。 表格组件中常见的就是&#xff1a;标题和内容一一对应&#xff1a; 像效果图中的效果&#xff0c;只用基础的表格布局是不行的&#xff0c;因…...

【考前预习】4.计算机网络—网络层

往期推荐 【考前预习】3.计算机网络—数据链路层-CSDN博客 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 目录 1.网络层概述 2.网络层提供的两种服务 3.分类编址的IPV4 4.无分类编址的IPV4—CIDR 5.IPV4地址应用规划 5.1使用定长子…...

【java】MDC

目录 1. 说明2. 作用3. 使用4. 与TraceID的关系5. 注意事项 1. 说明 1.MDC&#xff08;Mapped Diagnostic Context&#xff09;是一个用于在多线程环境中追踪和传递日志上下文信息的机制。2.映射诊断环境。3.MDC是一个线程本地的、可维护的、可传递的上下文环境。4.它允许开发…...

Android 好的开源库

1. 权限请求框架 GitHub - getActivity/XXPermissions: Android 权限请求框架&#xff0c;已适配 Android 14 2. 下载框架 GitHub - lingochamp/okdownload: A Reliable, Flexible, Fast and Powerful download engine....

Go 语言结构

Go 语言结构 Go 语言,也称为 Golang,是一种由 Google 开发和支持的静态类型、编译型编程语言。它于 2009 年首次发布,旨在提高多核处理器、网络资源和大型代码库的性能。Go 语言以其简洁的语法、并发支持和强大的标准库而闻名,特别适合构建高性能的网络服务和分布式系统。…...

【漆学军】MT5几个重要类库的使用例子

MT5编程&#xff0c;有两种方式&#xff0c;一种是函数式编程&#xff0c;一种是面向对象编程。 面向对象编程&#xff0c;会让我们编写代码变得非常简单。 面向对象编程&#xff0c;主要是要熟悉4个类库。 #include <Trade\PositionInfo.mqh> #include <Trade\Tra…...

在 Ubuntu 24.04.1 LTS (WSL) 中使用 openssl 生成 keybox.xml

看到“生成 keybox.xml”&#xff0c;大概率都会联想到 PIF 和 Tricky Store。这里就不多解释它们的用途了。最近在网上看到生成非 AOSP keybox 的教程&#xff0c;在这里做一些补充&#xff0c;并将代码打包成一个 Python 脚本。 参考自&#xff1a; Idea 提供者&#xff1a…...

【JavaSE基础】第十六章:IO流

一、理解 1.简单而言&#xff1a;流就是内存与存储设备之间传输数据的通道、管道。 2.流的分类&#xff1a; (1) 按方向 ( 以 JVM 虚拟机为参照物 ) 【重点】 输入流&#xff1a;将< 存储设备 > 中的内容读入到 < 内存 > 中。 输…...

常见漏洞—SSRF_FastCGI

FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 # 访问url --> 浏览器生成HTTP请求报文 --> web server解析请求&#xff08;例如nginx&#xff09; web server 是内容的分发者 当访问静态页面时&#xff0c;web server 会直接返回资源&#xff0c;例如index.htm…...

LeetCode 283.移动零(超简单讲解)

283.移动零 题目示例示例1示例2 解题思路快慢指针实现设计 详细代码 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例1 …...