Closure&Inherit

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析 本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。 阅读详情

1闭包

闭包是这样一种机制: 函数嵌套函数, 内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回。

这里涉及到几个概念:

1.函数嵌套函数。

2.作用域(全局变量和局部变量):变量的访问规则。

3.垃圾回收机制(garbage collection):js内部不断扫描内存,并清理无引用对象(自动完成)。

    function aa(){

        var num=10;

        function bb(){

            num++

            console.log(num);

        }

        return bb;

    }

    //bb(); //无法直接访问函数内部的函数

 

    aa()();//11

    aa()();//11

    aa()();//11

 

    var closure = aa();

    closure();//11

    closure();//12

    closure();//13

1.1闭包的好处

1.可以让一个变量长期驻扎在内存当中不被释放。

2.避免全局变量的污染, 和全局变量不同, 闭包中的变量无法被外部使用。

3.私有成员的存在, 无法被外部调用, 只可以自己内部使用。

1.2结论(如何描述闭包)

1.闭包是指有权访问另一函数作用域中的变量的函数。

2.闭包,可以访问函数内部的局部变量,并让其长期驻留内存。

3由于闭包会携带包含它的作用域(运行环境),因此会比其他函数占用更多内存,过度使用闭包可能会造成性能问题。

1.3扩展案例

点击按钮,打印当前索引值

var btn = document.querySelectorAll('button');

方法1:let方法

for(let i=0;i<btn.length;i++){

// btn[i].idx = i;

btn[i].onclick = function(){

console.log(i);

// console.log(this.idx);

}

}

 

方法2:闭包法

//下面的闭包中,onclick绑定的匿名函数立即执行,为每一个btn绑定了一个return后的函数,但没有执行,只有onclick后才执行

for(var i=0;i<btn.length;i++){

btn[i].onclick = (function(i){

// 闭包

return function(){

console.log(i);

}

})(i);

}

 

 

 

2 ES5对象扩展

2.1 Object.create(prototype)

以指定的原型创建对象。

2.2Object.defineProperty()

Object.defineProperty(object, propertyname, descriptor),对指定的对象的一个属性设置属性特性。传统方式添加的属性,属性特性都为true,Object.defineProperty添加的属性,属性特性都为false。

// 通过Object.defineProperty添加属性,属性特性默认都是false

Object.defineProperty(obj,'hobby',{

value:'很多'

});

 

// 设置age为不可修改的属性

Object.defineProperty(obj, 'age', {

writable:false,

enumerable:false

})

 

2.2.1值属性

1. configurable
可配置性,控制着其描述的属性的修改,表示能否修改属性的特性。

2. enumerable
可枚举性,表示能否通过for-in遍历得到属性。

3. writable
可写性,表示能否修改属性的值。

4. value
数据属性,表示属性的值。默认值为undefined。

2.2.2访问器属性

1. configurable

2. enumerable

3. get
在读取属性时调用的函数。只指定get则表示属性为只读属性。默认值为undefined。

4. set
在写入属性时调用的函数。只指定set则表示属性为只写属性。默认值为undefined。

2.3 Object.defineProperties()

Object.defineProperties(object, descriptors),对指定的对象的一组属性设置属性特性。

2.4 Object.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptor(object, propertyname),返回属性特性。

2.5 Object.keys(object)

Object.keys(object),返回对象所有可枚举属性的名称。

2.6 Object.getOwnPropertyNames()

Object.getOwnPropertyNames(object),返回所有属性的名称(哪怕说是不能枚举的属性)。Own的属性,不包括原型对象中的属性。

3原型链

实例与Object原型对象之间的链条称为原型链。

3.1原型模式的访问机制(原型搜索机制)

1.读取实例对象的属性时,先从实例对象本身开始搜索。如果在实例中找到了这个属性,则返回该属性的值;

2.如果没有找到,则继续搜索实例的原型对象,如果在原型对象中找到了这个属性,则返回该属性的值;

3.如果还是没找到,则向原型对象的原型对象查找,依此类推,直到Object的原型对象(最顶层对象);

4.如果再Object的原型对象中还搜索不到,则抛出错误。

3.1.1重置原型对象

重置原型对象,可以一次性给原型对象添加多个方法,但切断了与原来原型对象的联系。(注意覆盖问题注意识别问题)

function Popover(){}

Popover.prototype = {

    show:function(){},

    hide:function(){}

}

3.1.2内置原型对象

使用内置原型可以给已有构造函数添加方法。

· 数组/字符串/数字等方法调用原理;

· 扩展内置方法。

3.2对象属性的遍历与判断

3.2.1 for..in

遍历对象中的所有可枚举属性, 无论该属性存在于实例中还是原型中。

3.2.2 in

只要通过对象能够访问到属性就返回true, 无论该属性存在于实例中还是原型中。

if(name in s1){

}

3.2.3对象 hasOwnProperty(属性)

检测一个属性是存在于对象本身中。

· 返回true,说明属性存在对象中;

· 返回false,说明属性不存在或在原型中。

检测一个属性是否存在于原型中:!obj.hasOwnProperty(name) && (name in obj)。

4继承

继承是面向对象中一个非常重要的特征。指的是:子类继承父类的属性和方法。我们可以通过继承的方式, 在父类的属性和方法基础上, 让子类也拥有这些属性和方法, 并可以扩展。

4.1继承的好处

1.子类拥有父类所有的属性和方法(代码复用);

2.子类可以扩展自己的属性和方法(更灵活);

3.子类可以重写父类的方法。

4.2继承的方式

4.2.1原型链继承

核心:拿父类实例来充当子类原型对象。

缺点:1.无法继承构造函数中的属性;2.创建子类实例时,无法向父类构造函数传参;3.原型对象中存在多余的属性。

function Student(name,age,gender){

// 属性

this.name = name;

this.age = age;

this.gender = gender;

}

// 原型对象添加方法

Student.prototype.say = function(){

console.log('超能说')

}

Student.prototype.cry = function(){

console.log('超能哭')

}

function Pupil(){

}

// 原型链继承法

Pupil.prototype = new Student();  //利用父类实例充当子类原型对象

Pupil.prototype.constructor = Pupil; //将pupil.prototype中的constructor重新设置为pupil,否则puil.prototype将没有constructor属性,无法得知实例由谁创建的

Pupil.prototype.cry = function(){

}

var p1 = new Pupil();

 

4.2.2借用构造函数

核心:借父类的构造函数来增强子类实例,相当于把父类的实例属性复制一份给子类实例。

1.call(obj):
格式:父类构造函数.call(子类实例,参数1,参数2,参数3...)。

特点:1.立刻执行函数;2.改变函数中的this指向(指向obj)。

function Student(name,age,gender){

// 属性

this.name = name;

this.age = age;

this.gender = gender;

}

// 原型对象添加方法

Student.prototype.say = function(){

console.log('超能说')

}

Student.prototype.cry = function(){

console.log('超能哭')

}

function Pupil(name,age,gender){

// 借用构造函数法(继承属性)

Student.call(this,name,age,gender); //this代表的是当前函数中的this,

指向Pupil创建的实例对象

}

var p1 = new Pupil();

2.apply:
格式:父类构造函数.apply(子类实例,[参数1,参数2,参数3...])。

call与apply的唯一区别:传参方式不同,call多个参数,apply只有两个参数,第二个参数为数组。

//aplly用法:借用方法

    var arr = [20,2,40,33,21,8,22,46,32]

Math.max.apply(null,arr) //借用了Math的max方法

 

//call用法

 

//buttons指获取到的页面上的按钮的类数组,但是类数组没有array中的forEach方法,所以通过call借用,funciton(ele,idx){...}为Array.forEach(function(ele,idx){..})中的参数

Array.prototype.forEach.call(buttons,function(ele,idx){

//forEach(ele,idx,arr) forEach内可以有三个参数,ele是数组元素,idx为索引值,arr为数组本身

console.log(ele);

ele.onclick = function(){

console.log(idx);

}

});

 

缺点:无法实现函数复用;函数太多就会影响性能,占用更多内存。

4.2.3组合继承

由于以上继承方法的缺点,实际开发中不可能单纯的只使用一种继承方法,而是利用它们的优点,规避它们的缺点,所以就有了组合继承法。组合继承是最常用的继承模式。

继承属性:借用构造函数,只在构造函数中定义属性。

继承方法:原型链继承,把所有的方法写入原型对象。

缺点(原型链继承法的缺点):1.在原型对象中生成多余的属性;2多次执行父类构造函数。

4.2.4原型式继承

核心:先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例。解决原型链继承法的缺点:生成多余的属性。

Pupil.prototype = object(Student.prototype);

function object(o){

        function F(){}

        F.prototype = o;

        return new F();

    }

ES5版本的原型式继承:Object.create()

Pupil.prototype = Object.create(Student.prototype);

// 解决识别问题

Pupil.prototype.constructor = Pupil;

4.2.5寄生组合继承法

完美的继承方法,核心:1.继承属性:借用构造函数;2.继承方法:原型式继承。

5 ES6中的继承

5.1 class定义类

ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

//定义类

class Person {

    constructor(name,age) {

        this.name = name;

        this.age = age;

}

// 方法

// 这里添加的方法

// * 自动成为原型对象的方法

// * 自动设置属性特性

    getInfo() {

         return `我叫${this.name},今年${this.age}岁`;;

    }

}

注意:

1.写在类里面的方法实际是给Person.prototype添加方法。

2.constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。如果没有constructor方法,则得使用默认的constructor方法。

5.2 extends继承

class Person {

    constructor(name, age) {

        this.name = name;

        this.age = age;

    }

}

class Man extends Person {

    constructor(name, age, gender) {

        //this.gender = gender; // 报错

        super(name, age); //生成实例传参时可以少传参数,在super补全即可

        this.gender = gender; // 正确

    }

}            

1.子类继承了父类,在子类构造函数中必须调用super方法。

2.子类的constructor方法没有调用super之前,不能使用this关键字,否则报错,而放在super方法之后就是正确的。

5.3静态方法

如果在一个方法前,加上static关键字,这就称为“静态方法”。

class Person {

    constructor(){

        this.name = 'laoxie',

        this.age = 18;

    }

    static getInfo(){

        return this.name

    }

    say(){

        console.log(`Hello everyone, my name is ${this.name}, I'm ${this.age} years old`)

    }

}

class Man extends Person {}

1.静态方法方法不会被实例继承,而是直接通过类来调用Person.getInfo()。

2.父类的静态方法,可以被子类继承Man.getInfo()。

Copula函数 Copula是处理统计中随机变量相关性问题的一种方法。本文是对Copula函数的各种定义,Copula函数的思想,Copula函数的性质,Copula函数的类型等理论资料总结 阅读详情

相关推荐

DDR ECC错误注入与寄存器配置实战指南

本文详细介绍了DDR ECC错误注入的核心价值与实战操作指南,包括通过FI_Dx和FI_ECC寄存器注入数据与ECC错误的方法。文章提供了环境准备、寄存器配置、错误检测及系统可靠性测试策略,帮助开发者验证内存系统的纠错能力和可靠性,提升硬件开发的稳定性与效率。

nnn11的博客 1104

移动端页面布局:百分比布局、rem布局

移动端页面布局:百分比布局、rem布局 1 弹性盒布局(百分比布局) 例如,拉勾网、天猫首页。 好处:充分发挥大手机的优势——显示内容越多;缺点:屏幕过大,间距过大,比例失调。 特点: - 顶部与底部的bar不管分辨率怎么变,它的高度和位置都不变; - 中间每条招聘信息不管分辨率怎么变,招聘公司的图标等信息都位于条目的左边,薪资都位于右边。 2 rem布局(等比缩放布局) 例如,网

Hyperyou的博客 7227

SAP与泛微OA集成(半导体行业)

本项目通过SAP PO中间件集成SAP与泛微OA在半导体行业的应用,由于行业特殊性,广泛深入应用了RSA加密等特性

集信通 1164

弹性盒布局、多列布局、媒体查询

弹性盒布局、多列布局、媒体查询 1 flexbox布局 1.1 flexbox布局简介 flexbox布局,即伸缩布局盒模型,又叫弹性盒布局,用来提供一个更有的方式制定、调整和分布一个容器里的项目布局,即使它们的大小是未知或动态的。 中心思想:让容器有能力让其子项目能够改变其宽度、高度(甚至顺序);以最佳的方式填充可用空间(主要是为了适应所有类型的显示设备和屏幕大小)。flexbox容器会

Hyperyou的博客 2515

一文读懂Cache一致性原理

本文介绍了为什么需要维护cache一致性、一致性协议的本质和类别,以及如何设计一致性协议。

W1Z1Q的专栏 6847

基于Scrapy+Playwright的学术会议信息智能爬取系统实战

本文详细介绍如何使用Python构建一个高效的学术会议信息爬取系统,结合Scrapy框架和Playwright无头浏览器技术,实现对全球学术会议数据的自动化采集、清洗和存储。文章包含完整的技术方案设计、代码实现细节以及性能优化策略,可帮助读者快速掌握现代网络爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、学术会议、数据采集、反爬对抗python复制下载。

2201_76125261的博客 711

JavaScript循环语句++

JavaScript循环语句++ 1循环嵌套 for(var i=0;i     for(var j=0;j         console.log(i,j);     } } for循环执行过程:1.变量初始化;2.条件判断;3.执行代码;4.变量更新。上述代码中,外部的for循环1次,内部的for循环10次。 2循环跳转 2.1 break break://退出当前整个循环

Hyperyou的博客 1664

在实车上进行lio-sam测试

PS:将雷达和imu相对固定后,拆下来,原地晃啊晃,直到xyz进度达到百分百,参考gif。标定完成后,会在result文件夹下生成result.txt。

如果想成为中心,那么就到中心去吧。 997

CSS3更多属性 浏览器私有前缀

CSS3更多属性 浏览器私有前缀 1边框相关属性 1.1边框圆角border-radius 1.border-top-left-radius:10px20px;  单一选择一个角时,注意是top与bottom在前,right与left在后。第一个数值代表圆角水平方向半径值,第二个数值代表圆角垂直方向半径值。 2.Border-radius:10px15px 20px 30px/30px 1

Hyperyou的博客 1480

3D 结构光相机工作原理全解 | 从编码投射到三维重建,原理 + 代码 + 工业实战一站式掌握

本文从3D结构光相机的整体架构出发,层层拆解了编码投射、相位计算、相位解包裹、三维重建的核心原理,补充了工业实战所需的公式推导、代码实现、参数调优、设备选型和案例落地,核心总结如下:相位是3D结构光成像的“灵魂”,其精度、稳定性直接决定3D重建的效果,包裹相位与绝对相位的区分的是工业实战的基础;编码投射的核心是“正弦条纹+格雷码条纹”组合,正弦条纹负责高精度相位提取,格雷码条纹辅助解包裹,适配工业场景的精度与稳定性需求;

getusushu的博客 416

喷涂机器人系列编程:ABB IRB 5500_(2).ABB IRB 5500喷涂机器人系统架构与组件

ABB IRB 5500喷涂机器人系统不仅在性能上表现出色,而且在安全和维护方面也提供了全面的解决方案。通过本文的详细介绍,希望读者能够更好地理解和掌握这一系统的架构和功能,为实际应用提供有力支持。

zhubeibei168的博客 779

RegExp正则表达式

RegExp正则表达式 1了解正则表达式 1.1什么是正则表达式 正则表达式(regular expression)是一个描述字符模式的对象。 1.2为什么要使用正则表达式 正则表达式能够进行强大的“模式匹配”和“文本检索与替换”功能。前端往往有大量的表单数据校验的工作,采用正则表达式会使得数据校验的工作量大大减轻。 2正则表达式的创建 2.1 构造函数的方式 第一个参数就是我们的

Hyperyou的博客 1423

R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归

前言 线性回归的参数估计主要采用的是最小二乘法(又称最小平方法),该法是将使观测值与模型预测值之差的平方达到最小的值作为参数估计值。如果数据存在异常点或者异方差,最小二乘法估计会存在偏差,常用的处理策略就是改用稳健回归(Robust Regression)。 稳健回归就是采用更为稳健的参数估计方法来拟合模型,所谓稳健就是数据的波动对参数估计影响不大,比如不受异常值影响,或删除某一观测后对结果影响不大。稳健估计的方法有很多,主要有这么几类:最小绝对值回归(也称最小一乘法回归,lAV),最小中位数二乘法(L

wenyusuran的专栏 3161

Event事件

Event事件 1什么是事件 事件是可以被JavaScript侦测到的行为。网页中的每个元素都可以产生某些可以触发JavaScript函数的事件。 1.1事件的绑定方式 格式:元素.on+事件名 = 事件处理程序,如div.onclick = function(){}。 1.2事件的类型 1.2.1鼠标事件 onclick 当用户点击某个对象时调用的事件。 ondblclick

Hyperyou的博客 1257

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

盒模型、3d变换、关键帧动画

盒模型、3d变换、关键帧动画 1杂七杂八 1.1box-shadow边框阴影 box-shadow:18px 27px 10px 30px red inset; 第一个数值代表水平偏移;第二个数值代表垂直偏移;第三个数值代表模糊区域;第四个数值代表拓展区域;第五个数值代表阴影颜色;第六个数值代表内阴影还是外阴影,其中默认属性为外阴影,inset为内阴影。 注意:水平偏移,内阴影时是从左边

Hyperyou的博客 987

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

宽高自适应、过滤器 伪类选择器

宽、高自适应 过滤器 伪类选择器 1宽、高自适应 元素的大小能够根据窗口或子元素自动调整,这就是自适应。 自适应优点:它能够使同一个网页显示更灵活,可以适应在不同设备、不同窗口和不同分辨率下显示。 1.1宽度自适应 div是块级元素,宽度即使不设置也会默认为父级的100%。   div{width:1000px;}     ul{width:50%;}    li{

Hyperyou的博客 944

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ECMAScript5(ES5)

ECMAScript5(ES5) 1支持ES5的浏览器 · Opera 11.60+; · Internet Explorer 9+,IE9不支持严格模式; · Firefox 4+; · Safari 5.1+; · Chrome 13。 2加载事件 2.1 DOM文档加载步骤 1.解析HTML结构。 2.加载外部脚本和样式表文件。 3.解析并执行脚本代码。 4.DOM树

Hyperyou的博客 812

模块化开发

模块化开发 requirejs RequireJS的目标是鼓励代码的模块化,它使用在js中加载js文件的方式代替传统的script加载步骤。可以用它来加速、优化代码,但其主要目的还是为了代码的模块化。 requirejs的出现主要解决两个问题: 1. 实现js文件的异步加载,避免网页失去响应; 2. 管理模块之间的依赖性,便于代码的编写和维护。 1使用 按照requireJS当中的规

Hyperyou的博客 747

2017_7_14 float、盒子、第一次做静态网页心得

浮动、盒模型 1浮动 1.标准流中,默认从左往右,从上到下布局; 2.float:left/right/none;(不浮动) 3.浮动的元素将脱离标准流; 4.浮动后的元素相当于行内块级元素 5.浮动的元素虽然脱离了标准流,但没有脱离文本流。所以在布局中,我们可以将文本环绕图片,这是因为text与img都是文本流,虽然两者的盒子重叠,但是文本流不重叠。   多个盒模型浮动时,盒子的

Hyperyou的博客 730

Ajax

Ajax 1了解AJAX AJAX: Asynchronous Javascript And Xml,Ajax技术的核心是XMLHttpRequest对象(简称XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现。 1.1 ajax的起源 最早出现在2005年的google搜索建议。 1.2 ajax的优点 1.增加速度:减轻服务器的负担,按需加载数据,最大程

Hyperyou的博客 689

Sass

Sass 语法 编译 SassSASS是一个成熟、稳定、强大的 CSS 扩展语言解析器,提供变量、嵌套、混合、继承等特性,大大节省了设计者的时间,使得CSS的开发变得简单和可维护语法 注释 sass有两种注释方式(与js相同) 多行注释/* */ 单行注释// body { color: #333; // 这种注释内容不会出现在生成的css文件中 padding: 0; /* 这种注释内

Hyperyou的博客 680

JavaScript基本语法++、语句Statement

JavaScript基本语法、语句Statement 1 JavaScript基本语法++ 1.1隐式转换 如果运算不能进行下去,内部就会尝试进行数据类型的转换支持隐式转换的运算:逻辑运算、关系运算、数学运算。 如var num1 = number.value; num1 - 10 => Number(num1) - 10; num1 + 10 => num1 + String(10)

Hyperyou的博客 650

Gulp

gulp 安装与运行 gulp工作流程 gulp API gulp插件 常用gulp插件 其他常用插件 globs语法 gulpgulp是当下最流行的自动化工具 ,可以自动化完成我们开发过程中大量的重复工作。为什么要用自动化构建工具? 主要是用来自动完成一系列重复的操作,如: 编译: less->css sass->css coffeescript->js es6->es5 合并: css, js

Hyperyou的博客 635

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 147

副队长BootStrap5探究(2)--按钮与按钮组

本文系统讲解Bootstrap 5按钮组件的使用与底层原理。通过CDN引入框架,掌握btn基础类及primary、success等主题色应用,学习轮廓按钮(btn-outline-*)、尺寸控制(btn-lg/sm)、块级布局(d-block)和禁用状态(disabled)等实用功能。结合源码解析,深入理解其基于CSS的圆角、过渡动画、伪类交互实现机制,实现“快速上手+原理掌握”的双重目标,助力前端技能进阶。

编程副队长 669

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 328
上一篇: php
下一篇: jQuery
Hyperyou
博客等级 码龄9年 8粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值